一、Redis基础数据结构

string (字符串)、list (列表)、set (集合)、hash (哈 希) 和 zset (有序集合)

1、String

String一个常见的用途就是缓存用户信息。将用户信息结构体用JSON序列化成字符串,然后将序列化后的字符串塞进Redis来缓存。

Redis的字符串是动态字符串,内部结构类似于ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
图片说明
内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。
当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。
需要注意的是字符串最大长度为 512M。

键值对

127.0.0.1:6379[1]> set name Bob
OK
127.0.0.1:6379[1]> get name
"Bob"
127.0.0.1:6379[1]> append name 666
(integer) 6
127.0.0.1:6379[1]> get name
"Bob666"
127.0.0.1:6379[1]> strlen name
(integer) 6
127.0.0.1:6379[1]> getrange name 0 -1 //获取指定范围内的值
"Bob666"

过期和set命令拓展

127.0.0.1:6379[1]> set name Tom
OK
127.0.0.1:6379[1]> get name
"Tom"
127.0.0.1:6379[1]> expire name 5 //5s后过期
(integer) 1
127.0.0.1:6379[1]> get name
"Tom"
127.0.0.1:6379[1]> get name
(nil) //已过期
127.0.0.1:6379[1]> setex name 5 Jimmy //5s后过期,等价于set+expire
OK
127.0.0.1:6379[1]> get name
"Jimmy"
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> setnx name Hanhan //如果name不存在就执行set创建
(integer) 1
127.0.0.1:6379[1]> get name
"Hanhan"
127.0.0.1:6379[1]> setnx name Hanhan //name已存在,则创建失败
(integer) 0
127.0.0.1:6379[1]> get name
"Hanhan"

2、List

Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为O(n)

右边进左边出:队列

127.0.0.1:6379[1]> rpush phone xiaomi huawei iphone vivo meizu
(integer) 5
127.0.0.1:6379[1]> llen phone
(integer) 5
127.0.0.1:6379[1]> lrange phone 0 -1
1) "xiaomi"
2) "huawei"
3) "iphone"
4) "vivo"
5) "meizu"
127.0.0.1:6379[1]> lpop phone
"xiaomi"
127.0.0.1:6379[1]> lrange phone 0 -1
1) "huawei"
2) "iphone"
3) "vivo"
4) "meizu"

左边进右边出:栈

127.0.0.1:6379[1]> lpush food rice banana apple orange
(integer) 4
127.0.0.1:6379[1]> lrange food 0 -1
1) "orange"
2) "apple"
3) "banana"
4) "rice"
127.0.0.1:6379[1]> lpop food
"orange"
127.0.0.1:6379[1]> lrange food 0 -1
1) "apple"
2) "banana"
3) "rice"
127.0.0.1:6379[1]> rpop food
"rice"
127.0.0.1:6379[1]> lrange food 0 -1
1) "apple"
2) "banana"