专栏首页Java开发者Redis的基础数据结构与使用

Redis的基础数据结构与使用

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 来缓存。同样,取用户信息会经过一次反序列化的过程。

键值对

1.png

批量键值对: 可以批量对多个字符串进行读写,节省网络耗时开销

2.png

过期和 set 命令扩展: 可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间

set key 5秒后失效

3.png

等同于

4.png

setnx:key不存在时,才进行set,否则不成功

5.png

原子计数:如果 value 值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是 signed long 的最大最小值,超过了这个值,Redis 会报错,可以用来完成幂等的功能

incr、incrby、设置为Long.maxValue

6.png

list (列表)

Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。 Redis 的列表结构常用来做异步队列使用++。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。

rpush、rpop、lpush、lpop (右进左出:队列 右进右出:栈)

7.png

hash (字典)

Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的++数组 + 链表二维结构++。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。

hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对 用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。 hash 也有缺点,hash 结构的存储消耗要高于单个字符串,到底该使用 hash 还是字符串,需要根据实际情况再三权衡。

hset key field value 、hgetall key

8.png

hlen

9.png

hget key field、hmset key field value [field value ...]

10.png

set (集合)

Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。 当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。

sadd、sismember、scard、spop

11.png

zset (有序集合)

zset 似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。

zadd、zrange、zrevrange、zcard、zscore、zrank、zrankbyscore、zrem

12.png

13.png

keys(全量遍历键)

keys用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,性能比较差,要避免使用

14.png

scan(渐进式遍历键)

scan 参数提供了三个参数,第一个是 cursor 整数值,第二个是 key 的正则模式,第三个是遍历的 limit hint。第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。

15.png

看上图,从0开始,每次遍历 count:2个,正则模式:name* 的key,第一行输出的“6”,代表了下一个游标从6开始,本次遍历出来2个key,而第二次遍历时,下一个游标从9开始,此时出现了3个key,这是为啥呢?实际上redis的存储的键值对使用的hashtable存储的,6是数组那一栏的值,而出现3个key则很有可能是因为hash碰撞了,以链表的形式,加到了同一个数组栏上。(个人理解,如果错误,欢迎指正)

个人认为是下图这种情况:

16.png

info(查看redis服务运行信息)

分为 9 大块,每个块都有非常多的参数,这 9 个块分别是: Server : 服务器运行的环境参数 Clients : 客户端相关信息 Memory : 服务器运行内存统计数据 Persistence : 持久化信息 Stats : 通用统计数据 Replication : 主从复制相关信息 CPU : CPU 使用情况 Cluster : 集群信息

17.png


有问题可以留言,感觉有帮助可以点个喜欢 :)!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis核心原理

    Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b Redis的基础数据结构与使用:https:...

    zoro
  • CentOS Linux 7 VMware的IP与网络设置

    ①打开控制面板-网络和Internet-网络连接 ②找到VMnet8,右键属性,找到IPv4,点击属性,进行如下图设置

    zoro
  • Linux CentOS 7 虚拟机克隆

    删除Linux物理地址绑定的文件(该文件会在操作系统重启并生成物理地址以后将物理地址绑定到IP上),如果不删除,则操作系统会一直绑定着克隆过来的物理地址;

    zoro
  • Xcode不显示历史记录的解决方案

    LinXunFeng
  • 【DB笔试面试581】在Oracle中,绑定变量是什么?绑定变量有什么优缺点?

    通常在高并发的OLTP系统中,可能会出现这样的现象,单个SQL的写法、执行计划、性能都是没问题的,但整个系统的性能就是很差,这表现在当系统并发的数量增加时,整个...

    小麦苗DBA宝典
  • 前后端分离ssm配置swagger接口文档

    http://ip地址:端口(默认80,不显示)/项目名/swagger-ui.html

    道可道非常道
  • 实用篇-无处不在的Location

    location配置是nginx模块化配置中最出色的一个设计,几乎所有nginx的业务场景都要通过书写多个location配置来顺应业务需要。语法配置和执行规则...

    后端技术探索
  • 实用篇-无处不在的Location

    location配置是nginx模块化配置中最出色的一个设计,几乎所有nginx的业务场景都要通过书写多个location配置来顺应业务需要。语法配置和执行规则...

    后端技术探索
  • 扒虫篇-Bug日志 Ⅱ

    事情是这样的:一个风和日丽的下午,我正在 itunesConnect 中注册一个APP,基本信息都保存了,在编辑版本信息时,都弄的差不多了,可是没有保存,结果不...

    進无尽
  • scRNAseq包更新动作太大

    这个数据集很出名,截止2019年1月已经有近400的引用了,后面的人开发R包算法都会在其上面做测试,比如 SinQC 这篇文章就提到:We applied Si...

    生信技能树

扫码关注云+社区

领取腾讯云代金券