Redis 学习笔记(二) 数据类型之String 和List 使用

2.1 关于Redis 键(key) 的几个常用操作

  • set k1[key] lbk[value] : k1 为你想设置的键,lbk为你想设置的值。这里我设置了一个键为k1 ,值为lbk 的键值对。
  • get k1 : 得到键为k1 的值
  • keys * : 查看当前库所有的 key
  • exists key : 查看某个key 是否存在
  • type key : 判断key 的类型
  • del key : 删除某个key
  • unlink key : 也是删除某个key ,但是是根据value 选择非阻塞删除。不同是虽然显示删除完成,但是真正的操作会在后续异步操作完成。
  • expire key : 设置key 的过期时间
  • ttl key : 查看key 还有多少秒过期,-1 表示永不过期,-2 表示已过期,正数表示还有多少秒
  • select 1 : 切换到 1 号库,默认是在0 号库
  • dbsize : 查看当前数据库的key 的数量
  • flushdb : 删除当前库的所有数据
  • flushall : 删除所有库的数据 (后两个命令应用很少)

以上的命令测试如下:

2.2 Redis 字符串(String)

2.2.1 简介

String 是Redis 最基本的类型,一个key 对应一个value 。String 类型是二进制安全的,这意味这Redis 的string 类型可以包含任何数据,比如图片或者序列化的对象。String 类型是Redis 最基本的数据类型,一个Redis 字符串的value 最多可以是 512M。

2.2.2 常用命令

  • set k1 lbk : 设置一个键为k1 , 值为lbk 的键值对
  • get k1 : 得到键为 k1 的值
  • append k1 abc : 在键为 k1 的值上面追加 abc
  • strlen k1 : 输出 键为 k1 的字符串的长度
  • setnx k1 value : 设置键为k1 值为value 的键值对,与set 的区别是只有在键不存在时才能设置,set 是有则覆盖。
  • incr k3 : 将 k3 中设置的数字值增加 1
  • decr k3 : 将 k3 中设置的数字值减少 1
  • incrby k3 5 : 将k3 中设置的数字值增加 5
  • decrby k3 5 : 将k3 中设置的数字值减少 5
  • mset k1 v1 k2 v2 : 同时设置多个key-value 键值对
  • mget k1 k2 k3 : 同时得到多个key 的value 值
  • msetnx k11 v11 k12 v12 k13 v13 : 同时设置多个key-value ,但是需要新建键值对,而不能给已有的键重新设值(和setnx 一样),在这个操作中,由于是原子性的操作,只要其中有一个值设置不成功,整条命令就不会运行成功。
  • getrange k1 0 3 : 拿到键为k1 的value 值, 并输出位置0 到位置 3 的所有字符
  • setrange k1 1 aaa : 从1 开始,覆写 k1 的字符串的值。
  • getset k1 v1 : 以新值换旧值

Note1

Redis 中的所有操作都是原子性的操作,这种操作一旦开始就会一直运行到结束,中间不会被打断。Redis 底层使用的是单线程加多路复用的技术,所以中间不会发生线程切换。

在单线程中,能够在单条指令中完成的操作就叫做原子操作,因为中断指令只能发生在指令之间。

在多线程中,不能被其他进程(线程)打断的操作就叫做原子操作,Redis 单命令的原子性就得益于Redis 的单线程。

Note2 - Redis 字符串的底层数据结构

String 类型的数据结构在Redis 底层是简单动态字符串。是可以修改的字符串,内部结构类似于Java 的Arraylist 。采取预分配冗余空间的方式来减少内存的频繁分配。当分配空间小于 1M 时,空间不够则扩容一倍; 而当字符串的长度大于 1M 时,每次多分配1M 的空间。

2.3 Redis 列表(List)

2.3.1 简介

Redis 列表是简单的字符串列表,也就说一个键对应多个值,按照插入的顺序排序。可以插入值到列表的头部或者尾部。

它的底层是一个双向链表,对两端操作的性能很高,然而索引下标来操作中间节点的性能是比较差的。

2.3.2 常用命令

  • lpush k1 v1 v2 v3 : 从左边向 k1 里面依次插入 v1 v2 v3 的值

  • rpush k2 v1 v2 v3 : 从右边向 k2 里面一次插入 v1 v2 v3 的值

  • lrange k1 0 -1 : 查看 k1 的列表中的所有数据,0表示起始位置,-1(表示列表的尾部) 表示结束位置

  • lpop/rpop k1 : 从左边/右边弹出一个值(值在键在,值光键亡)。

  • lindex k1 0 : 从k1 的 0 位置取出值,就是取出指定位置的值。

  • llen k1 : 输出k1 的长度

  • linsert k1 before/after v1 v2 : 在 k1 列表中 v1 值的前面/后面 插入 v2 值。

  • lrem k1 2 v1 : 从左边删除 2 个 为v1 的值

  • lset k1 3 v1 : 将 k1 里面索引下标为3 的 值替换为 v1

几个命令的操作:

Note - Redis 列表的底层数据结构

Redis 的List(列表)底层数据结构为快速链表 quickList。

首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是zipList,也就是压缩列表。它将所有的元素一起存储,分配的是一块连续的内存。当数据量多的时候才会改成quickList。

这是因为普通的链表需要的指针开销太大。Redis 将链表和zipList 结合起来组成了quickList。也就是将多个zipList 串起来使用。这样既满足了快速的插入和删除性能,又不会出现太大的空间冗余。

posted @ 2021-11-17 19:49  李同学的跋涉  阅读(177)  评论(0编辑  收藏  举报