RedisTemplate使用文档
一.Redis五种基本数据类型
1.String字符串
String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字。
应用场景
- 计数器—点赞,视频播放量,每播放一次就+1
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
2.Hash散列表
Redis 的哈希是键值对的集合。
Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象,还有用户信息之类的,经常变动的信息。
Hash更适合用于对象的存储,String更适合字符串存储。
使用场景
- 主要用于存储部分变更数据,比如存储用户信息等等
3.List链表
Redis 的链表是简单的字符串列表,排序插入顺序。您可以添加元素到 Redis 的列表的头部或尾部
Lpush:表示的是向链表的左添加,也就是向链表的头添加;
Rpush:表示的是向链表的右添加,也就是向链表的尾添加;
应用场景
- 消息队列:利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。
- 消息排队,消息队列(Lpush、Rpop)、栈(Lpush、Lpop)
- 使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。
4.Set( 集合)
Redis 的集合是字符串的无序集合。
在Set集合当中,是不允许有重复的。
set是通过hash table实现的,可以进行添加、删除和查找。对集合我们可以取并集,交集,差集.
应用场景
- 微博、用户将所有关注的人都放入到一个set集合当中,将它的粉丝也放在一个集合中。
- 共同关注、共同爱好、二度好友、QQ的好友推荐(六度分割理论)
5.SortedSet( 有序集合) zset
Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合。
应用场景
- 存储班级成绩表、工资表排序
二.Spring Data Redis
Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。 spring-data-redis针对jedis提供了如下功能:
- 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
- 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
-
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
- 提供了对key的“bound”(绑定)便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须“显式”的再次指定Key,即BoundKeyOperations:
-
- BoundValueOperations
- BoundSetOperations
- BoundListOperations
- BoundSetOperations
- BoundHashOperations
- 将事务操作封装,有容器控制。
- 针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer)
JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。
StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】
三.RedisTemplate的使用
1 // 确定给定 key 是否存在,有的话就返回 true,没有就返回 false 2 redisTemplate.hasKey(K key) 3 4 // 删除给定的 key 5 redisTemplate.delete(K key) 6 7 // 删除给定 key 的集合 8 redisTemplate.delete(Collection<K> keys) 9 10 // 执行 Redis 转储命令并返回结果,把key值序列化成byte[]类型 11 redisTemplate.dump(K key) 12 13 // 对传入的key值设置过期时间、将给定 key 的过期时间设置为日期时间戳 14 redisTemplate.expire(K key, long timeout, TimeUnit unit) 15 redisTemplate.expireAt(K key, Date date) 16 17 // 查找与给定模式匹配的所有 key ,返回的是一个没有重复的Set类型 18 redisTemplate.keys(K pattern) 19 20 // 将 oldKey 重命名为 newKey 21 redisTemplate.rename(K oldKey, K newKey) 22 23 // 获取key值的类型 24 redisTemplate.type(K key) 25 26 // 仅当 newKey 不存在时,才将密钥 oldKey 重命名为 newKey。 27 redisTemplate.renameIfAbsent(K oldKey, K newKey) 28 29 // 随机从redis中获取一个key 30 redisTemplate.randomKey() 31 32 // 获取当前key的剩下的过期时间 33 redisTemplate.getExpire(K key) 34 35 // 获取剩余的过期时间,同时设置时间单位 36 redisTemplate.getExpire(K key, TimeUnit timeUnit) 37 38 // 删除 key 的过期时间 39 redisTemplate.persist(K key) 40 41 // 将给定的 key 移动到带有索引的数据库 42 redisTemplate.move(K key, int dbIndex)
2.RedisTemplate.opsForValue() 方法
1 // 设置 key 跟 value 的值 2 redisTemplate.opsForValue().set(K key, V value) 3 4 // 获取 key 的值 5 redisTemplate.opsForValue().get(Object key) 6 7 // 设置key跟value的值,同时设置过期时间 8 redisTemplate.opsForValue().set(K key, V value, Duration timeout) 9 10 // 在 start 和 end 之间获取键值的子字符串 11 redisTemplate.opsForValue().get(K key, long start, long end) 12 13 // 设置 key 的值并返回其旧值 14 redisTemplate.opsForValue().getAndSet(K key, V value) 15 16 // 获取多个 key 17 redisTemplate.opsForValue().multiGet(Collection<K> keys) 18 19 // 获取原来的key的值后在后面新增上新的字符串 20 redisTemplate.opsForValue().append(K key, String value) 21 22 // 增量方式增加double值 23 redisTemplate.opsForValue().increment(K key, double increment) 24 25 // 通过increment(K key, long delta)方法以增量方式存储long值(正值则自增,负值则自减) 26 redisTemplate.opsForValue().increment(K key, long increment) 27 28 // 仅当提供的 key 不存在时,才使用集合中提供的键值对将多个 key 设置为多个值。 29 redisTemplate.opsForValue().multiSetIfAbsent(Map<? extends K,? extends V> map) 30 31 // 使用集合中提供的键值对将多个 key 设置为多个值。 32 Map map = new HashMap(); map.put("1","1"); map.put("2","2"); 33 map.put("3","3"); 34 redisTemplate.opsForValue().multiSet(Map<? extends K,? extends V> map) 35 36 // 获取指定key的字符串的长度 37 redisTemplate.opsForValue().size(K key) 38 39 // 用给定值覆盖从指定偏移量开始的 key 的部分。 40 redisTemplate.opsForValue().set(K key, V value, long offset) 41 42 // 如果 key 不存在,则设置 key 以保存字符串值,存在返回false,否则返回true 43 redisTemplate.opsForValue().setIfAbsent(key, value) 44 45 // 重新设置key的值并加入过期时间 46 redisTemplate.opsForValue().set(key, value, timeout, unit) 47 48 // 将二进制第offset位值变为value 49 redisTemplate.opsForValue().setBit(K key, long offset, boolean value) 50 51 // 对key所储存的字符串值,获取指定偏移量上的位(bit) 52 redisTemplate.opsForValue().getBit(K key, long offset)
3.RedisTemplate.opsForHash() 方法
1 // 从 key 处的 hash 中获取给定 hashKey 的值,即 key field(hashKey) value 2 redisTemplate.opsForHash().get(H key, Object hashKey) 3 4 // 获取存储在 key 的整个 hash,即获取所有值 5 redisTemplate.opsForHash().entries(H key) 6 7 // 设置hash hashKey 的值 8 redisTemplate.opsForHash().put(H key, HK hashKey, HV value) 9 10 // 使用 m 中提供的数据将多个 hash 字段设置为多个值,即使用 map 进行赋值 11 redisTemplate.opsForHash().putAll(H key, Map<? extends HK,? extends HV> m) 12 13 // 仅当 hashKey 不存在时才设置 hash hashKey 的值。 14 redisTemplate.opsForHash().putIfAbsent(H key, HK hashKey, HV value) 15 16 // 删除给定的hash hashKeys 17 redisTemplate.opsForHash().delete(H key, Object... hashKeys) 18 19 // 确定给定的hash hashKey 是否存在 20 redisTemplate.opsForHash().hasKey(H key, Object hashKey) 21 22 // 通过给定的增量增加hash hashKey 的值 23 redisTemplate.opsForHash().increment(H key, HK hashKey, double increment) 24 redisTemplate.opsForHash().increment(H key, HK hashKey, long increment) 25 26 // 在 key 处获取 hash 的 hashKey 集(字段) 27 redisTemplate.opsForHash().keys(H key) 28 29 // 获取 key 的 hash 大小。 30 redisTemplate.opsForHash().size(H key) 31 32 // 在 key 处获取 hash 的值 33 redisTemplate.opsForHash().values(H key) 34 35 // 查看匹配的键值对 36 redisTemplate.opsForHash().scan(H key, ScanOptions options)
4.RedisTemplate.opsForList() 方法
1 // 从 key 的 list 中获取索引处的元素 2 redisTemplate.opsForList().index(K key, long index) 3 4 // 从 key 的 list 中获取 start 和 end 之间的元素 5 redisTemplate.opsForList().range(K key, long start, long end) 6 7 // 为 key 添加值 8 redisTemplate.opsForList().leftPush(K key, V value) 9 10 // 将值添加到 key 中 11 redisTemplate.opsForList().leftPushAll(K key, Collection<V> values) 12 13 // 仅当 list 存在时,才将值添加到 key 中 14 redisTemplate.opsForList().leftPushIfPresent(K key, V value) 15 16 // 在 pivot 之前将值添加到 key 中 17 redisTemplate.opsForList().leftPush(K key, V pivot, V value) 18 19 // 将值附加到 key 20 redisTemplate.opsForList().rightPush(K key, V value) 21 redisTemplate.opsForList().rightPushAll(K key, Collection<V> values) 22 23 // 在 pivot 之后将值添加到 key 中 24 redisTemplate.opsForList().rightPush(K key, V pivot, V value) 25 26 // 在列表元素的索引处设置值 27 redisTemplate.opsForList().set(K key, long index, V value) 28 29 // 删除并返回存储在 key 的列表中的第一个元素、 30 redisTemplate.opsForList().leftPop(K key) 31 redisTemplate.opsForList().leftPop(K key, Duration timeout) 32 redisTemplate.opsForList().leftPop(K key, long count) 33 redisTemplate.opsForList().leftPop(K key, long timeout, TimeUnit unit) 34 35 // 删除并返回存储在 key 的列表中的最后一个元素 36 redisTemplate.opsForList().rightPop(K key) 37 redisTemplate.opsForList().rightPop(K key, Duration timeout) 38 redisTemplate.opsForList().rightPop(K key, long count) 39 redisTemplate.opsForList().rightPop(K key, long timeout, TimeUnit unit) 40 41 // 从 sourceKey 的列表中删除最后一个元素,将其附加到 destinationKey 并返回其值 42 redisTemplate.opsForList().rightPopAndLeftPush(K sourceKey, K destinationKey) 43 redisTemplate.opsForList().rightPopAndLeftPush(K sourceKey, K destinationKey, Duration timeout) 44 45 // 从存储在 key 的列表中删除第一个 count 出现的 value 46 redisTemplate.opsForList().remove(K key, long count, Object value) 47 48 // 在 start 和 end 之间的元素的 key 处修剪列表 49 redisTemplate.opsForList().trim(K key, long start, long end) 50 51 // 获取存储在 key 的列表的大小 52 redisTemplate.opsForList().size(K key)
5.RedisTemplate.opsForSet() 方法
1 // 在 key 的 set 中添加给定值 2 redisTemplate.opsForSet().add(K key, V... values) 3 4 // 在 key 的 set 中删除给定值并返回已删除元素的数量 5 redisTemplate.opsForSet().remove(K key, Object... values) 6 7 // 从 key 的 set 中移除并返回一个随机成员 8 redisTemplate.opsForSet(). pop(K key) 9 10 // 在 key 处获取集合的大小 11 redisTemplate.opsForSet().size(K key) 12 13 // 检查在 key 的 set 中是否包含值 14 redisTemplate.opsForSet().isMember(K key, Object o) 15 16 // 返回在 key 和 otherKeys 处与所有给定 sets 相交的成员 17 redisTemplate.opsForSet().intersect(K key, Collection<K> otherKeys) 18 19 // 在 key 和 otherKeys 处与所有给定 sets 相交,并将结果存储在 destKey 中 20 redisTemplate.opsForSet().intersectAndStore(K key, Collection<K> otherKeys, K destKey) 21 22 // 在 key 和 otherKey 处相交所有给定的 sets,并将结果存储在 destKey 中 23 redisTemplate.opsForSet().intersectAndStore(K key, K otherKey, K destKey) 24 25 // 合并给定 key 和 otherKey 的所有 sets 26 redisTemplate.opsForSet().union(K key, K otherKey) 27 28 // 将给定 key 和 otherKey 处的所有 set 合并,并将结果存储在 destKey 中 29 redisTemplate.opsForSet().unionAndStore(K key, K otherKey, K destKey) 30 31 // 获取差集 32 redisTemplate.opsForSet().difference(key, otherKeys) 33 34 // 获取差集并存储到destKey 35 redisTemplate.opsForSet().differenceAndStore(key, otherKey, destKey) 36 37 // 随机获取集合中的一个元素 38 redisTemplate.opsForSet().randomMember(key) 39 40 // 获取集合中的所有元素 41 redisTemplate.opsForSet().members(key) 42 43 // 随机获取集合中count个值 44 redisTemplate.opsForSet().randomMembers(key, count) 45 46 // 随机获取集合中count个值,但是去重 47 redisTemplate.opsForSet().distinctRandomMembers(key, count) 48 49 // 遍历set 50 redisTemplate.opsForSet().scan(key, options)
6.RedisTemplate.opsForZSet() 方法
1 // 添加元素,从小到大排序 2 redisTemplate.opsForZSet().add(key, value, score) 3 4 // 删除多个values的值 5 redisTemplate.opsForZSet().remove(key, values) 6 7 // 增加元素的score值同时返回增加后的值 8 redisTemplate.opsForZSet().incrementScore(key, value, delta) 9 10 // 返回元素在集合的从小到大排名 11 redisTemplate.opsForZSet().rank(key, value) 12 13 // 返回元素在集合的由大到小排名 14 redisTemplate.opsForZSet().reverseRank(key, value) 15 16 // 获取集合中指定区间的元素 17 redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end) 18 19 // 查询集合中的元素并从小到大排序 20 redisTemplate.opsForZSet().reverseRangeByScore(key, min, max) 21 redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, min, max) 22 23 // 从高到低的排序,然后获取最小与最大值之间的值 24 redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, start, end) 25 26 // 根据score值获取元素数量 27 redisTemplate.opsForZSet().incrementScore(key, value, delta) 28 29 // 获取集合的大小 30 redisTemplate.opsForZSet().size(key)redisTemplate.opsForZSet().zCard(key) 31 32 // 获取集合中key、value元素的score值 33 redisTemplate.opsForZSet().score(key, value) 34 35 // 移除指定索引元素 36 redisTemplate.opsForZSet().removeRange(key, start, end) 37 38 // 移除指定score范围的集合成员 39 redisTemplate.opsForZSet().removeRangeByScore(key, min, max) 40 41 // 获取key和otherKey的并集并存储在 destKey 中 42 redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey) 43 44 // 获取key和otherKey的交集并存储在 destKey 中 45 redisTemplate.opsForZSet().intersectAndStore(key, otherKey, destKey)