spring-data-redis-基本玩法 - UDF

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缓存,而我们在业务逻辑层则只管更新数据就行了,缓存更新的操作都放给以上的缓存层逻辑来完成。

link

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值