javascript
SpringBoot 2.x 集成 Redis
SpringBoot 2.x 集成 Redis
windows上搭建redis環(huán)境
添加依賴
此處redis客戶端使用jedis。
<!-- redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>redis.clients</groupId><artifactId>jedis</artifactId></exclusion><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions> </dependency> <!-- redis 客戶端使用jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId> </dependency>Jedis
直接連接 redis server。在多線程環(huán)境下是非線程安全的,需要使用連接池,為每個(gè)Jedis實(shí)例增加物理連接。
Lettuce
連接基于Netty,連接實(shí)例可以在多個(gè)線程間并發(fā)訪問。因?yàn)檫B接實(shí)例是線程安全的,所以一個(gè)連接實(shí)例就可以滿足多線程環(huán)境下的并發(fā)訪問。
添加配置
2.0 版本之前的一些配置已被移除。使用jedis就配置jedis(如下配置),使用lettuce換下名稱即可。
# REDIS (RedisProperties) # Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0) spring.redis.database=0 # Redis服務(wù)器地址 spring.redis.host=127.0.0.1 # Redis服務(wù)器連接端口 spring.redis.port=6379 # Redis服務(wù)器連接密碼(默認(rèn)為空) spring.redis.password= # 連接超時(shí)時(shí)間(毫秒) spring.redis.timeout=0ms # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制) spring.redis.jedis.pool.max-active=8 # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制) spring.redis.jedis.pool.max-wait=-1ms # 連接池中的最大空閑連接 spring.redis.jedis.pool.max-idle=8 # 連接池中的最小空閑連接 spring.redis.jedis.pool.min-idle=0添加redis配置類
SpringBoot1.5x之前,Redis配置類如下:
@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {@Beanpublic KeyGenerator keyGenerator() {return new KeyGenerator() {@Overridepublic Object generate(Object target, Method method, Object... params) {StringBuilder sb = new StringBuilder();sb.append(target.getClass().getName());sb.append(method.getName());for (Object obj : params) {sb.append(obj.toString());}return sb.toString();}};}@Beanpublic CacheManager cacheManager(RedisTemplate redisTemplate) {RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);return redisCacheManager;}}SpringBoot2.0 Redis配置類如下(普遍使用了build模式),
@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {@Beanpublic CacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();return redisCacheManager;}@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());// value序列化redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class)); redisTemplate.afterPropertiesSet();return redisTemplate;}}緩存管理器
- RedisCacheManager
- SimpleCacheManager
- NoOpCacheManager
- ConcurrentMapCacheManager
- CompositeCacheManager
- EhCacheCacheManager
序列化器
- GenericToStringSerializer:使用Spring轉(zhuǎn)換服務(wù)進(jìn)行序列化;
- JacksonJsonRedisSerializer:使用Jackson 1,將對(duì)象序列化為JSON;
- Jackson2JsonRedisSerializer:使用Jackson 2,將對(duì)象序列化為JSON;
- JdkSerializationRedisSerializer:使用Java序列化;
- OxmSerializer:使用Spring O/X映射的編排器和解排器(marshaler和unmarshaler)實(shí)現(xiàn)序列化,用于XML序列化;
- StringRedisSerializer:序列化String類型的key和value。
redis使用
自動(dòng)根據(jù)方法生成緩存
訪問/api/user/{id}接口,會(huì)將結(jié)果緩存。代碼如下:
@RestController@RequestMapping(value = "/api")public class StudentController {@AutowiredOmsUserRepository omsUserRepository;@GetMapping(value = "/user")public List<OmsUser> getAllUser() {return this.omsUserRepository.findAll();}@GetMapping(value = "/user/{id}")@Cacheable(value = "user-key")public OmsUser getUserById(@PathVariable("id") String id) {return omsUserRepository.findById(id).get();}}@Cacheable
表明spring在調(diào)用方法之前,首先應(yīng)該在緩存中查找方法的返回值。如果這個(gè)值能夠找到,就會(huì)返回緩存的值。否則的話,這個(gè)方法就會(huì)被調(diào)用,返回值會(huì)放到緩存之中。
@CachePut
表明spring應(yīng)該將方法的返回值放到緩存中。在方法的調(diào)用前不會(huì)檢查緩存,方法始終都會(huì)被調(diào)用。
@CacheEvict
表明spring應(yīng)該在緩存中清除一個(gè)或多個(gè)條目
@Caching
這是一個(gè)分組的注解,能夠同時(shí)應(yīng)用多個(gè)其它的緩存注解。
自定義key
@Cacheable和@CachePut都有一個(gè)名為key屬性,可使用spel表達(dá)式獲取值。
- #root.args:傳遞給緩存方法的參數(shù),形式為數(shù)組
- #root.caches:該方法執(zhí)行時(shí)所對(duì)應(yīng)的緩存,形式為數(shù)組
- #root.target:目標(biāo)對(duì)象
- #root.targetClass:目標(biāo)對(duì)象的類,等同#root.target.class
- #root.method:緩存方法
- #root.methodName:緩存方法的名字,等同root.method.name
- #result:方法調(diào)用的返回值,不能用在@Cacheable注解上
- #Argument:任意的方法參數(shù)名(如#argName)或參數(shù)索引(如#a0或#p0)
條件化緩存
@Cacheable和@CachePut提供了兩個(gè)屬性用以實(shí)現(xiàn)條件化緩存:unless和condition,這兩個(gè)屬性都接受一個(gè)SpEL表達(dá)式。
unless
僅阻止將對(duì)象放進(jìn)緩存,在這個(gè)方法被調(diào)用的時(shí)候,依然會(huì)去緩存中進(jìn)行查找,如果找到了匹配的值,就會(huì)返回找到的值。condition
如果表達(dá)式計(jì)算結(jié)果為false,那么在這個(gè)方法調(diào)用的過程中,緩存是被禁用的。即在這個(gè)方法被調(diào)用的時(shí)候,不會(huì)去緩存進(jìn)行查找,同時(shí)返回值也不會(huì)放進(jìn)緩存中。
使用 Template(模版)
模版種類:
- StringRedisTemplate
- RedisTemplate
測(cè)試代碼:
@RunWith(SpringRunner.class)@SpringBootTestpublic class TestRedis {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test() throws Exception {// setstringRedisTemplate.opsForValue().set("key", "value");// getString value = stringRedisTemplate.opsForValue().get("key");Assert.assertEquals("value", value);}@Testpublic void testObj() throws Exception {User user = new User("king", "boy", 18);ValueOperations<String, User> operations = redisTemplate.opsForValue();// setoperations.set("obj.user.key", user);// getUser user2 = operations.get("obj.user.key");Assert.assertEquals(user.getName(), user2.getName());Assert.assertEquals(user.getSex(), user2.getSex());Assert.assertEquals(user.getAge(), user2.getAge());}}測(cè)試代碼中User user2 = operations.get("obj.user.key")會(huì)報(bào)錯(cuò)java.util.LinkedHashMap cannot be cast to User。修改redis配置類,如下:
@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {@Beanpublic CacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();return redisCacheManager;}@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());// value序列化// 使用Jackson ,將對(duì)象序列化為JSONJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//json 轉(zhuǎn)對(duì)象類,不設(shè)置默認(rèn)的會(huì)將json轉(zhuǎn)成hashmapObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}}共享 session
添加依賴
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>session配置
@Configuration@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)public class SessionConfig {}測(cè)試
@RequestMapping("/uid")String uid(HttpSession session) {UUID uid = (UUID) session.getAttribute("uid");if (uid == null) {uid = UUID.randomUUID();}session.setAttribute("uid", uid);return session.getId();}第一次訪問后生成session,第二次及以后訪問獲取到session值相同。redis存儲(chǔ)session形式如下圖:
轉(zhuǎn)載于:https://www.cnblogs.com/wscy/p/9241747.html
總結(jié)
以上是生活随笔為你收集整理的SpringBoot 2.x 集成 Redis的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种特别的颜色参数
- 下一篇: git+jekyll部署备忘