Redis数据

**

官网介绍

**
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)

RedisTemplate操作Redis

redisTemplate.hasKey(key);//判断是否存在key
redisTemplate.keys(String pattern);//返回模糊搜索匹配的key,返回Set<String>,如果传"*"则返回所有的key的集合
redisTemplate.expire(key, timeout, unit);//设置缓存失效时间,timeout整数,unit时间单位
redisTemplate.rename(oldKey, newKey);//修改redis中key的名称
redisTemplate.type(key);//返回传入key所存储的值的类型
redisTemplate.randomKey();//从redis中随机取出一个key

数据结构

1. 字符串(strings)
字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结 构的差异就在于 value 的结构不一样。
Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字 符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时, 扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是 字符串最大长度为 512M。

//获取key对应的值:
redisTemplate.opsForValue().get(String key);
//设置值:
redisTemplate.opsForValue().set(key, value);
redisTemplate.opsForValue().set(key, value,time,unit);//time:缓存失效时间;unit:时间单位(时/分/秒)
//批量获取值:
List<String> results = redisTemplate.opsForValue().multiGet(keys);
//在原有的值基础上新增字符串到末尾:
redisTemplate.opsForValue().append(key, value);
//获取字符串的长度
redisTemplate.opsForValue().size(key)
//删除redis缓存数据:
redisTemplate.delete(key);//key可传数组批量删除

2. 散列(hashes)
哈希等价于Java语言的HashMap或者是Python语言的dict,在实现结构上它使用二维结构,第一维是数组,第二维是链表,hash的内容key和value存放在链表中,数组里存放的是链表的头指针。通过key查找元素时,先计算key的hashcode,然后用hashcode对数组的长度进行取模定位到链表的表头,再对链表进行遍历获取到相应的value值,链表的作用就是用来将产生了「hash碰撞」的元素串起来。Java语言开发者会感到非常熟悉,因为这样的结构和HashMap是没有区别的。哈希的第一维数组的长度也是2^n。
-------Hash数据结构--------在这里插入图片描述

//获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null。
redisTemplate.opsForHash().get(key, item);
//获取变量中的键值对
redisTemplate.opsForHash().entries(key);
//新增hashMap值
redisTemplate.opsForHash().put(key, item, value);
//以map集合的形式添加键值对
redisTemplate.opsForHash().putAll(key, maps);
//删除一个或者多个hash表字段
redisTemplate.opsForHash().delete(key, fields);
//获取所有hash表中item
redisTemplate.opsForHash().keys(key);
//获取hash表中字段的数量
redisTemplate.opsForHash().size(key);
//获取hash表中存在的所有的值
redisTemplate.opsForHash().values(key);

3. List类型
Redis将列表数据结构命名为list而不是array,是因为列表的存储结构用的是链表而不是数组,而且链表还是双向链表。因为它是链表,所以随机定位性能较弱,首尾插入删除性能较优。如果list的列表长度很长,使用时我们一定要关注链表相关操作的时间复杂度。
负下标 链表元素的位置使用自然数0,1,2,…n-1表示,还可以使用负数-1,-2,…-n来表示,-1表示「倒数第一」,-2表示「倒数第二」,那么-n就表示第一个元素,对应的下标为0。
队列/堆栈 链表可以从表头和表尾追加和移除元素,结合使用rpush/rpop/lpush/lpop四条指令,可以将链表作为队列或堆栈使用,左向右向进行都可以
-------------链表数据结构--------------------链表数据结构

//通过索引获取列表中的元素
redisTemplate.opsForList().index(key, index);
//获取列表指定范围内的元素(start开始位置, 0是开始位置,end 结束位置, -1返回所有)
redisTemplate.opsForList().range(key, start, end);//返回List<String>
//获取指定链表的长度
redisTemplate.opsForList().size(key);
//向链表中放入值
redisTemplate.opsForList().rightPush(key,value);
//向链表中添加集合
redisTemplate.opsForList().rightPushAll(key,list);//list 为集合List<String>
//根据索引修改链表中的数据
redisTemplate.opsForList().set(key,index,value);
//移除链表中指定value的数据,count为移除多少个,因为链表的数据允许重复
redisTemplate.opsForList().remove(key,count,value);

4. Set类型
Java程序员都知道HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值
在 Redis 中 set 也是可以保存多个字符串的,经常有人会分不清 list 与 set,下面我们重点介绍一下它们之间的不同:
set 中的元素是不可以重复的,而 list 是可以保存重复元素的。
set 中的元素是无序的,而 list 中的元素是有序的。
set 中的元素不能通过索引下标获取元素,而 list 中的元素则可以通过索引下标获取元素。
除此之外 set 还支持更高级的功能,例如多个 set 取交集、并集、差集等。
-----------------Set数据结构--------------------
Set数据结构

//根据key获取Set中的所有值
redisTemplate.opsForSet().members(key);//返回Set<String>
//根据key和value查询set中是否存在这个值
redisTemplate.opsForSet().isMember(key,value);//返回boolean
//将数据放入set缓存
redisTemplate.opsForSet().add(key,values);//values可为数组,返回long:插入成功的个数
//获取set缓存的长度
redisTemplate.opsForSet().size(key);
//移除指定key和value的缓存数据
redisTemplate.opsForSet().remove(key,values);//values可为数组

5. zset
SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层实现使用了两个数据结构,第一个是hash,第二个是跳跃列表,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。跳跃列表的目的在于给元素value排序,根据score的范围获取元素列表。
----------------zset数据结构--------------------
zset数据结构

//获得指定元素的分数
Double score = redisTemplate.opsForZSet().score("ranking-list", "p1");
//向zset中添加单个数据并设置权重
redisTemplate.opsForZSet().add(key, value, score);
//向zset中添加多个数据并设置权重
DefaultTypedTuple<String> tuple1 = new DefaultTypedTuple<String>("p2", 1.1);
DefaultTypedTuple<String> tuple2 = new DefaultTypedTuple<String>("p3", 3.1);
redisTemplate.opsForZSet().add("ranking-list", new HashSet<>(Arrays.asList(tuple1, tuple2)));
//删除指定的key、value的数据
redisTemplate.opsForZSet().remove(key, value);
//为指定元素加权重
redisTemplate.opsForZSet().incrementScore(key, value, score);
//返回指定成员的排名(从小到大)
Long rank = redisTemplate.opsForZSet().rank(key, value);
//从大到小
Long reverseRank = redisTemplate.opsForZSet().reverseRank(key, value);
//返回集合内元素的排名,以及分数(从小到大)
Set<TypedTuple<String>> tuples = redisTemplate.opsForZSet().rangeWithScores(key, 0, -1);
for (TypedTuple<String> tuple : tuples) {
     System.out.println(tuple.getValue() + " : " + tuple.getScore());
}
//返回集合内元素在指定分数范围内的排名(从小到大)
Set<String> ranking = redisTemplate.opsForZSet().rangeByScore(key, 0, 5);
//带偏移量和个数,下例意为从第二个开始,要三个
Set<String> ranking2 = redisTemplate.opsForZSet().rangeByScore(key, 0, 5, 1, 3);
//删除指定索引范围的元素
redisTemplate.opsForZSet().removeRange(key, 0, 0);
//删除指定分数范围内的元素
redisTemplate.opsForZSet().removeRangeByScore("ranking-list", 4, 5);
//按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部
Set<String> range = redisTemplate.opsForZSet().range(key, 0, -1);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值