Redis 学习笔记(二) 数据类型之String 和List 使用
2.1 关于Redis 键(key) 的几个常用操作
set k1[key] lbk[value]
: k1 为你想设置的键,lbk为你想设置的值。这里我设置了一个键为k1 ,值为lbk 的键值对。get k1
: 得到键为k1 的值keys *
: 查看当前库所有的 keyexists key
: 查看某个key 是否存在type key
: 判断key 的类型del key
: 删除某个keyunlink 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 的值上面追加 abcstrlen k1
: 输出 键为 k1 的字符串的长度setnx k1 value
: 设置键为k1 值为value 的键值对,与set 的区别是只有在键不存在时才能设置,set 是有则覆盖。incr k3
: 将 k3 中设置的数字值增加 1decr k3
: 将 k3 中设置的数字值减少 1incrby k3 5
: 将k3 中设置的数字值增加 5decrby k3 5
: 将k3 中设置的数字值减少 5mset 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 串起来使用。这样既满足了快速的插入和删除性能,又不会出现太大的空间冗余。