notice
按照我们约定的jackson序列化方式;
取值,如果不是null; 直接直接用括号强制转化;
引入
https://blog.csdn.net/aisu_yan/article/details/84787214
conncet
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis pool -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>>
配置 写入yml
spring:
redis:
database: 3
host: 10.3.50.182
jedis:
pool:
max-active: 1
max-idle: 1
max-wait: 3600
min-idle: 1
password: RedisPass
port: 27000
timeout: 3600
思想
当你的redis数据库里面本来存的是 字符串数据或者你要存取的数据就是字符串类型数据的时候 ,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
常用工具
StringRedisTemplate
这东西部分类型,全是字符串!!!
使用
@Autowired
private StringRedisTemplate redis;
//向redis里存入数据和设置缓存时间
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);
//val做-1操作
stringRedisTemplate.boundValueOps("test").increment(-1);
//根据key获取缓存中的val
stringRedisTemplate.opsForValue().get("test")
//val +1
stringRedisTemplate.boundValueOps("test").increment(1);
stringRedisTemplate.getExpire("test")//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合
玩法举例
// 拿字符串
String cpSession = redis.opsForValue().get(Constants.DlcKey.getDlcCpKey(dlc));
//给set添加值
redis.opsForSet().add(Constants.DlcKey.getCpOpsKey(cpSession), opSessionKey);
//给hash添加值
redis.opsForHash().put("man","chineseNan","15亿");
//拿出hashMap
Map<String, String> opSessionEntries = redis.<String, String>opsForHash().entries("man");
set放入数据,10s后失效
stringRedisTemplate.opsForZSet().add(MCS_DEV_HAS_OP_KEY(opSession.getDevSession()), opSession.getOpSession(), 10_000L+ System.currentTimeMillis());
RedisTemplate
redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null。 可以使用 StringRedisTemplate
redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set
List<Object> objects = Arrays.asList("one", "two");
List<Object> objects1 = redisTemplate.opsForHash().multiGet("S17:djms:setHashMap", objects);//从redis中获取多个key下面的多个对象,返回一个List列表
redisTemplate.opsForValue().multiGet()
List玩法
//向redis的某个key下面的list列表里面插入一个list列表,不会去重。
List<OrgRelationInfo> remainOrgNodes = new ArrayList<>();
redisTemplate.opsForList().leftPushAll(CACHE_KEY, remainOrgNodes);
//从redis中取出某一个key下面的list列表, 0表示从列表的第0个元素开始取,-1表示直取到倒数第一个元素,也就是整个列表的所有元素都取出来。
List<OrgRelationInfo> lastRemainOrgNodeList = redisTemplate.opsForList().range(CACHE_NAME + CACHE_REMAIN_KEY_PREFIX, 0, -1);
Redis作为Mysql缓存
采用redis nosql数据库作为Mysql数据库的缓存,在查找的时候,首先查找redis缓存,如果找到则返回结果;如果在redis中没有找到,那么查找Mysql数据库,找到的话则返回结果并且更新redis;如果没有找到则返回空。
对于写入的情况,直接写入mysql数据库,mysql数据库通过触发器及UDF机制自动把变更的内容更新到redis中。
写一个trigger触发器监控insert/update/delete这些修改数据的操作,当有修改操作的时候,调用对应的自定义UDF函数来远程回写redis缓存,而我们在业务逻辑层则只管更新数据就行了,缓存更新的操作都放给以上的缓存层逻辑来完成。