1.Redis 键(key)
-
keys *
: 查看当前库的所有 key127.0.0.1:6379> keys * 1) "k2" 2) "k1" 3) "k3"
-
exists key
: 判断某个 key 是否存在127.0.0.1:6379> exists k3 (integer) 1 127.0.0.1:6379> exists k4 (integer) 0
-
type key
: 查看 key 的数据类型127.0.0.1:6379> type k1 string 127.0.0.1:6379> type k3 string
-
del key
: 删除指定的 key 数据127.0.0.1:6379> del k2 (integer) 1
-
unlink key
: 根据 value 选择非阻塞删除
仅将 keys 从 keyspace 元数据中删除,真正的删除会在后续异步操作
-
expire key 10
:为给定的 key 设置过期时间 -
ttl key
: 查看剩余过期时间 -1 表示永不过期,-2 表示已经过期127.0.0.1:6379> ttl k1 (integer) -1
-
select key
: 切换数据库 -
dbsize
: 查看当前数据库 key 的数量127.0.0.1:6379> dbsize (integer) 2
-
flushdb
: 清空数据库 -
flushall
: 通杀全部库
2.Redis 字符串(string)
2.1 简介
String 是 Redis 最基本是的数据类型,可以理解为与 Memcached 一样的类型,一个 key 对应一个 vale
String 类型是二进制安全的,意味着 Redis 的 String 可以包含任何数据,比如 jpg 的图片或序列化的对象
String 类型是 Redis 最基本的数据类型,一个字符串 value 最多可以是 512M
2.2 常用命令
get <key>
: 查询对应键值
127.0.0.1:6379> get k2
"v2"
append <key> <value>
:将给定的 value 追加到原值的末尾
127.0.0.1:6379> append k2 v22
(integer) 5
127.0.0.1:6379> get k2
"v2v22"
strlen <key>
: key 的长度
127.0.0.1:6379> strlen k1
(integer) 2
setnx <key><value>
: 在 key 不存在时,设置 key-value
127.0.0.1:6379> setnx k4 v4
(integer) 1
incr <key>
: 将 Key 存储的数字值赠一,只能最数字值操作,如果为空,新增值为 1
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> get k1
"2"
decr <key>
: 将 key 中存储的数字值减一,只能对数字值操作,如果为空,新增值为-1
127.0.0.1:6379> decr k1
(integer) 1
127.0.0.1:6379> get k1
"1"
incrby / decrby <key><step>
:将 key 中存储的数字值增减 自定义步长、
127.0.0.1:6379> incrby k1 10
(integer) 11
127.0.0.1:6379> get k1
"11"
2.3 数据结构
String 的数据结构为简单动态字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方法来减少内存的频繁分配。
如图所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,则每次只多扩容 1M。字符串的最大长度是 512M.
3 Redis 列表(List)
3.1 简介
单键多值,Redis 列表是简单的字符串列表。
按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
3.2 常用命令
lpush/rpush <key><value1><value2><value3> ....
:从左边/右边插入一个或多个值。
lrange mylist 0 -1
:0 左边第一个,-1 右边第一个,(0-1 表示获取所有)
127.0.0.1:6379> lpush k1 1 2 3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush k2 4 5 6
(integer) 3
127.0.0.1:6379> lrange k2 0 -1
1) "4"
2) "5"
3) "6"
llen <key>
:获得列表长度
127.0.0.1:6379> llen k1
(integer) 3
lpop/rpop <key>
:从左边/右边吐出一个值。值在键在,值光键亡。
127.0.0.1:6379> lpop k1
"3"
rpoplpush <key1><key2>
:从 key1 列表右边吐出一个值,插到 key2 列表左边。
127.0.0.1:6379> rpoplpush k1 k2
"1"
127.0.0.1:6379> lrange k2 0 -1
1) "1"
2) "4"
3) "5"
4) "6"
linsert <key> before <value><newvalue>
:在 value 的后面插入 newvalue 值
127.0.0.1:6379> linsert k2 before 5 3
(integer) 5
127.0.0.1:6379> lrange k2 0 -1
1) "1"
2) "4"
3) "3"
4) "5"
5) "6"
lrem <key><n><value>
:从左边删除 n 个 value(从左到右)
lset<key><index><value>
:将列表 key 下标为 index 的值替换成 value
127.0.0.1:6379> lset k1 0 2
OK
127.0.0.1:6379> lrange k1 0 -1
1) "2"
3.3 数据结构
List 的数据结构为快速链表 quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量比较多的时候才会改成 quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next。
Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
4.Redis 集合(Set)
4.1 简介
set 对外提供的功能是类似于 list 的列表,但是 set 可以自动排重,并提供了判断元素是否存在的接口
Redis 的 Set 是 string 类型的无序集合。它底层其实是一个 value 为 null 的 hash 表,所以添加,删除,查找的复杂度都是 O(1)。
4.2 常用命令
sadd key value1 value2 ...
:将一个或多个 member 元素加入到集合 key 中,已经存在的元素将被覆盖
127.0.0.1:6379> sadd k1 1 2 3 1
(integer) 3
`
smembers key
: 取出该集合的所有元素
127.0.0.1:6379> smembers k1
1) "1"
2) "2"
3) "3"
sismember key value
: 判断集合 key 中是否有 value
127.0.0.1:6379> sismember k1 1
(integer) 1
127.0.0.1:6379> sismember k1 5
(integer) 0
scard key
:返回该集合的元素个数
127.0.0.1:6379> scard k1
(integer) 3
srem key value1 value2 ...
:删除集合中的某个元素
spop key
随机从该集合中吐出某个元素
srandmember key n
:随机从该集合中取出 n 个值,不会从集合中删除
smove source destination value
:从集合中把一个值移动到另一个集合中
sinter key1 key2
:返回两个集合的交集
sunion key1 key2
:返回两个集合的并集
sdiff key1 key2
:返回两个集合的差集
4.3 数据结构
Set 数据结构是 dict 字典,字典是用哈希表实现的。
Java 中 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。Redis 的 set 结构也是一样,它的内部也使用 hash 结构,所有的 value 都指向同一个内部值。
5 Redis 哈希(hash)
5.1 简介
Redis hash 是一个键值对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
类似 Java 里面的 Map<String,Object>
用户 ID 为查找的 key,存储的 value 用户对象包含姓名,年龄,生日等信息,如果用普通的 key/value 结构来存储
主要有以下两种存储方式:
5.2 常用命令
hset key field value
:给 key 集合中的 field 键赋值 value
hmset key
:field1 value1 field2 value2 ... 批量设置 hash 的值
127.0.0.1:6379> hset k1 name tom gender female
(integer) 2
127.0.0.1:6379> hset k2 name jerry gender female
(integer) 2
hget key field
:从 key 集合 field 取出 value
127.0.0.1:6379> hget k1 name
"tom"
hexists key
: field 查看哈希表 key 中,给定域 field 是否存在
127.0.0.1:6379> hexists k1 name
(integer) 1
127.0.0.1:6379> hexists k1 age
(integer) 0
hkeys key
:列出该 hash 集合的所有 field
127.0.0.1:6379> hkeys k1
1) "name"
2) "gender"
hvals key
:列出该 hash 集合的所有 value
127.0.0.1:6379> hvals k1
1) "tom"
2) "female"
hincrby key field increment
:为 key 中的域 field 的值加上增量 1 -1
hsetnx key field value
:将哈希表 key 中的域 field 的值设置为 value,当且仅当域 field 不存在
127.0.0.1:6379> hsetnx tom gender male
(integer) 1
127.0.0.1:6379> hget tom name
(nil)
127.0.0.1:6379> hsetnx tom age 10
(integer) 1
127.0.0.1:6379> hget tom age
"10"
5.3 数据结构
Hash 类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当 field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable
6.Redis 有序集合 Zset
6.1 简介
Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
6.2 常用命令
zadd key score1 value1 score2 value2... :将一个或多个 member 元素及其 score 值加入有序集合 key 中
127.0.0.1:6379> zadd k1 100 java 200 c++ 300 mysql 400 web
(integer) 4
zrange key start stop 返回有序集合 key 中下表在 start 与 stop 之间的元素、
带 WITHSCORES 可以显示 scores
127.0.0.1:6379> zrange k1 1 3
1) "c++"
2) "mysql"
3) "web"
127.0.0.1:6379> zrange k1 1 3 withscores
1) "c++"
2) "200"
3) "mysql"
4) "300"
5) "web"
6) "400"
zrangebyscore key minmax [withscores][limit offset count
返回集合 key 中所有 score 介于 min 和 max 之家的 member,按 score 值递增排列’
127.0.0.1:6379> zrangebyscore k1 200 300
1) "c++"
2) "mysql"
zrevrangebyscore key maxmin [withscores][limit offset count] 递减排列
127.0.0.1:6379> zrevrangebyscore k1 300 100
1) "mysql"
2) "c++"
3) "java"
6.3 数据结构
SortedSet(zset)是 Redis 提供的一个非常特别的数据结构,
一方面它等价于 Java 的数据结构 Map<String, Double>,可以给每一个元素 value 赋予一个权重 score,
另一方面它又类似于 TreeSet,内部的元素会按照权重 score 进行排序,可以得到每个元素的名次,还可以通过 score 的范围来获取元素的列表。
zset 底层使用了两个数据结构
(1)hash,hash 的作用就是关联元素 value 和权重 score,保障元素 value 的唯一性,可以通过元素 value 找到 相应的 score 值。
(2)跳跃表,跳跃表的目的在于给元素 value 排序,根据 score 的范围获取元素列表。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于