Redis的基础数据结构与使用
Redis系统介绍:
Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b
Redis的基础数据结构与使用:https://www.jianshu.com/p/c95c8450c5b6
Redis核心原理:https://www.jianshu.com/p/4e6b7809e10a
Redis 5 之后版本的高可用集群搭建:https://www.jianshu.com/p/8045b92fafb2
Redis 5 版本的高可用集群的水平扩展:https://www.jianshu.com/p/6355d0827aea
Redis 5 集群选举原理分析:https://www.jianshu.com/p/e6894713a6d5
Redis 5 通信协议解析以及手写一个Jedis客户端:https://www.jianshu.com/p/575544f68615
一、基础数据结构
Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
string (字符串)
字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用 JSON 序列化成字符串,然后将序列化后的字符串塞进 Redis 来缓存。同样,取用户信息会经过一次反序列化的过程。
键值对
批量键值对:
可以批量对多个字符串进行读写,节省网络耗时开销
过期和 set 命令扩展:
可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间
set key 5秒后失效
等同于
setnx:key不存在时,才进行set,否则不成功
原子计数:如果 value 值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是 signed long 的最大最小值,超过了这个值,Redis 会报错,可以用来完成幂等的功能
incr、incrby、设置为Long.maxValue
list (列表)
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
Redis 的列表结构常用来做异步队列使用++。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。
rpush、rpop、lpush、lpop (右进左出:队列 右进右出:栈)
hash (字典)
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的++数组 + 链表二维结构++。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对 用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。 hash 也有缺点,hash 结构的存储消耗要高于单个字符串,到底该使用 hash 还是字符串,需要根据实际情况再三权衡。
hset key field value 、hgetall key
hlen
hget key field、hmset key field value [field value ...]
set (集合)
Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。 当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
sadd、sismember、scard、spop
zset (有序集合)
zset 似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。
zadd、zrange、zrevrange、zcard、zscore、zrank、zrankbyscore、zrem
keys(全量遍历键)
keys用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,性能比较差,要避免使用
scan(渐进式遍历键)
scan 参数提供了三个参数,第一个是 cursor 整数值,第二个是 key 的正则模式,第三个是遍历的 limit hint。第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。
看上图,从0开始,每次遍历 count:2个,正则模式:name* 的key,第一行输出的“6”,代表了下一个游标从6开始,本次遍历出来2个key,而第二次遍历时,下一个游标从9开始,此时出现了3个key,这是为啥呢?实际上redis的存储的键值对使用的hashtable存储的,6是数组那一栏的值,而出现3个key则很有可能是因为hash碰撞了,以链表的形式,加到了同一个数组栏上。(个人理解,如果错误,欢迎指正)
个人认为是下图这种情况:
info(查看redis服务运行信息)
分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:
Server : 服务器运行的环境参数
Clients : 客户端相关信息
Memory : 服务器运行内存统计数据
Persistence : 持久化信息
Stats : 通用统计数据
Replication : 主从复制相关信息
CPU : CPU 使用情况
Cluster : 集群信息