在 SpringBoot 中集成 Redis
-
Spring提供两种Template操作Redis,分别是:StringRedisTemplate 和 RedisTemplate,区别如下:
- StringRedisTemplate
- StringRedisTemplate使用的是 StringRedisSerializer 序列化String
- 主要用来存储字符串,StringRedisSerializer的泛型指定的是String。当存入对象时,会报错 :can not cast into String。
- 可见性强,更易维护。如果过都是字符串存储可考虑用StringRedisTemplate
- RedisTemplate
- RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化对象
- 可以用来存储对象,但是要实现Serializable接口。
- 以二进制数组方式存储,内容没有可读性。
- StringRedisTemplate
-
在 SpringBoot中 整合 Redis , StringRedisTemplate的例子 ,RedisTemplate 类详解
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
#redis的ip地址 spring.redis.hostName=127.0.0.1 #数据库,默认为0 spring.redis.database=0 #端口号 spring.redis.port=6379 #如果有密码 spring.redis.password= #客户端超时时间单位是毫秒 默认是2000 spring.redis.timeout=10000
/* stringRedisTemplate.opsForValue();//操作字符串 stringRedisTemplate.opsForHash();//操作hash stringRedisTemplate.opsForList();//操作list stringRedisTemplate.opsForSet();//操作set stringRedisTemplate.opsForZSet();//操作有序set */ @Autowired StringRedisTemplate stringRedisTemplate; @Test public void testRadis(){ stringRedisTemplate.delete("key");//根据key删除缓存 stringRedisTemplate.hasKey("key");//检查key是否存在,返回boolean值 stringRedisTemplate.expire("setkey",1000 , TimeUnit.MILLISECONDS);//设置过期时间 stringRedisTemplate.getExpire("key");//根据key获取过期时间 stringRedisTemplate.getExpire("key",TimeUnit.SECONDS);//根据key获取过期时间并换算成指定单位 }
-
可以是字符串、整数或者浮点数
-
对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行 自增(increment)或者自减(decrement)
-
命令
set hello world get hello
-
Java 代码
//redisTemplate 有两个方法经常用到, 一个是opsForXXX一个是boundXXXOps, XXX是value的类型,前者获取到一个Opercation, 但是没有指定操作的key, 可以在一个连接(事务)内操作多个key以及对应的value; 后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value. stringRedisTemplate.boundValueOps("key").increment(-1); //val做-1操作 stringRedisTemplate.boundValueOps("key").increment(1); //val +1 //向redis里存入数据和设置缓存时间(5分钟) stringRedisTemplate.opsForValue().set("key", "value", 60*5, TimeUnit.SECONDS); stringRedisTemplate.opsForValue().get("key");//根据key获取缓存中的val stringTemplate.delete("key"); stringRedisTemplate.opsForValue.set("liu10", "6"); // 新增或更新 stringRedisTemplate.opsForValue.increment("liu10", 1); // 加 1 stringRedisTemplate.opsForValue.append("liu10", "haha"); // 追加字符串 Map<String,String> param = new HashMap<String,String>(); param.put("liu6", "liu6"); param.put("liu7", "liu7"); stringRedisTemplate.opsForValue.multiSet(param); //为多个键分别设置它们的值
-
List 列表
-
列表(链表)是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或尾部(右边)。类似 双向链表
-
从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素
-
适用于:最新消息排行等功能;消息队列。
-
命令
DEL runoob lpush runoob redis lpush runoob mongodb lrange runoob 0 10
-
Java 代码
//先进后出(左进左出) stringRedisTemplate.opsForList.leftPush("li1", "a"); // 添加 stringRedisTemplate.opsForList.leftPush("li1", "b"); List<Object> range = stringRedisTemplate.opsForList.range("li1", 0, -1); // 查询 for (Object object : range) { System.out.println(object);//c b a } List<Object> param = new ArrayList<Object>(); // 批量添加 stringRedisTemplate.opsForList.leftPushAll("li4", param); stringRedisTemplate.opsForList.size("li3"); stringRedisTemplate.opsForList.trim("li2", 1, -1); // stringRedisTemplate.opsForList.remove("li15", 1, "b"); // stringRedisTemplate.opsForList.leftPop("li17"); // //先进先出(右进左出) stringRedisTemplate.opsForList.rightPush("li7", "a"); stringRedisTemplate.opsForList.rightPush("li7", "b"); stringRedisTemplate.opsForList.rightPush("li7", "c"); List<Object> range = stringRedisTemplate.opsForList.range("li7", 0, -1); for (Object object : range) { System.out.println(object);//a b c }
-
-
Hash 散列
-
散列可以让用户将多个键值对存储到一个Redis键里面,即编程语言中的Map类型,适合存储对象
-
可以像数据库中update一个属性一样只修改某一项属性值。
-
适用于:存储、读取、修改用户属性。也可以用Hash做表数据缓存
-
命令
DEL runoob HMSET runoob field1 "Hello" field2 "World" HGET runoob field1
-
Java 代码
stringRedisTemplate.opsForHash.put("he1", "key1", "a"); stringRedisTemplate.opsForHash.put("he1", "key2", "b"); stringRedisTemplate.opsForHash.put("he1", "key3", "c"); Map<String, Object> entries = stringRedisTemplate.opsForHash.entries("he1"); // 全部 stringRedisTemplate.opsForHash.get("he1", "key1"); // 获取 1 个 Map<String,Object> param = new HashMap<String,Object>(); // 批量添加 stringRedisTemplate.opsForHash.putAll("he2", param); stringRedisTemplate.opsForHash.increment("he1", "key3", 1); // 加 1 stringRedisTemplate.opsForHash.hasKey("he1", "key2"); // true
-
-
Set 无序集合
-
集合成员是唯一的,这就意味着集合中不能出现重复的数据
-
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
-
适用于:共同好友;利用唯一性,统计访问网站的所有独立ip; 好友推荐时,根据tag求交集,大于某个阈值就可以推荐。
-
命令
DEL runoob sadd runoob redis smembers runoob
-
Java 代码
stringRedisTemplate.opsForSet().add("setkey", "1","2","3"); //向指定key中存放set集合 stringRedisTemplate.opsForSet.members("setkey"); // 返回集合中的所有成员 stringRedisTemplate.opsForSet.size("setkey"); // 无序集合的大小长度 stringRedisTemplate.opsForSet().isMember("setkey", "1");//根据key查看是否存在指定数据 stringRedisTemplate.opsForSet().isMember("version_available_ios", version);
-
-
ZSet 有序集合
-
Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。有序集合的成员是唯一的,但分数(score)却可以重复。redis正是通过分数来为集合中的成员进行从小到大的排序
-
数据插入集合时,已经进行天然排序。
-
适用于:排行榜;
-
命令
DEL runoob zadd runoob 0 redis zadd runoob 0 mongodb ZRANGEBYSCORE runoob 0 1000
-
Java 代码
stringRedisTemplate.opsForZSet().add("test:sart_service:rank", "301", 2); // 获取分数值范围在 min <= score <= max 之间的数据 zSetValue = stringRedisTemplate.opsForZSet().rangeByScore(redisKey, min, max); // 倒序排列 带上分数 获取从start行到end行之间的数据, Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet() .reverseRangeWithScores(redisKey, start, end); stringRedisTemplate.opsForZSet().incrementScore("test:sart_service:rank", "301", -1);
-