Redis 入门 #
Redis(Remote Dictionary Service)是目前互联网技术领域使用最为广泛的存储中间件,它是一个开源(BSD 许可)的,内存中的数据结构存储系 统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询,bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁 盘持久化(persistence),并通过 Redis 哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
数据类型 #
Redis 一共支持 5 种数据类型:
String(字符串) #
String
类型是最常用,也是最简单的的一种类型,string
类型是二进制安全的。也就是说 string
可以包含任何数据。比如 jpg 图片
或者 序列化的对象
。一个键最大能存储 512MB
。
redis> set testkey hello
OK
redis> get testkey
"hello"
Hash(哈希) #
Redis 对 JSON
数据的支持不是很友好。通常把 JSON
转成 String
存储到 Redis 中,但现在的 JSON
数据都是连环嵌套的,每次更新
时都要先获取整个 JSON
,然后更改其中一个字段再放上去。这种使用方式,如果在海量的请求下,JSON
字符串比较复杂,会导致在频繁更新数
据使网络 I/O 跑满,甚至导致系统超时、崩溃。所以 Redis 官方推荐采用哈希保存对象。
HSET
设置哈希类型的值HGET
获取单个哈希属性值HGETALL
获取所有哈希属性和值
redis> HSET xiaoming age 18
(integer) 1
redis> HSET xiaoming phone 15676666666
(integer) 1
redis> HMSET xiaoqiang age 18 phone 13816666666
OK
redis> HGET xiaoming age
"18"
redis> HGETALL xiaoming
1)"age"
2)"18"
3)"phone"
4)"15676666666"
redis> HGETALL xiaoqiang
1)"age"
2)"18"
3)"phone"
4)"13816666666"
List(列表) #
Redis 列表是简单的字符串列表,并根据插入顺序进行排序。一个 Redis 列表中最多可存储 232-1
(40 亿)个元素。
LPUSH
向列表的开头插入新元素,RPUSH
向列表的结尾插入新元素。LPOP
返回并移除列表头部的元素RPOP
返回并移除列表尾部的元素。LSET
对列表中指定索引位的元素进行操作。LSET
不允许对不存在的列表进行操作。LINDEX
获取列表指定索引位的元素
redis> LPUSH testlist one
(integer) 1
redis> RPUSH testlist two
(integer) 2
redis> LSET testlist 0 1
OK
redis> LINDEX testlist 0
"1"
redis> LPOP testlist
"1"
redis> RPOP testlist
"two"
redis> lindex testlist 0
(nil)
Set(集合) #
Redis 的 Set
是 string
类型的无序集合。集合中不允许重复成员的存在。一个 Redis 集合中最多可包含 232-1
(40 亿)个元素。
SADD
向集合中插入值SMEMBERS
获取集合中的元素SPOP
随机获取并删除一个值
redis> sadd class xiaoming xiaoqiang xiaogang
(integer) 3
redis> smembers class
1) "xiaoming"
2) "xiaoqiang"
3) "xiaogang"
redis> spop class
"xiaoqiang"
redis> smembers class
1) "xiaoming"
2) "xiaogang"
集合间的操作:
SINTER
查询集合间的交集SUNION
获取集间的并集SDIFF
获取集合间的差集SMOVE
把集合中的元素从一个集合移到另一个集中
redis> sadd class1 xiaoming xiaoqiang xiaogang
(integer) 1
redis> sadd class2 xiaoming xiaoli
(integer) 1
redis> sinter class1 class2
1) "xiaoming"
redis> sunion class1 class2
1) "xiaoming"
2) "xiaoqiang"
3) "xiaogang"
4) "xiaoming"
5) "xiaoli"
redis> sdiff class1 class2
1) "xiaoqiang"
2) "xiaogang"
redis> smove class1 class2 xiaoqiang
(integer) 0
redis> smembers class2
1) "xiaoming"
2) "xiaoqiang"
3) "xiaoli"
zset (sorted set, 有序集合) #
Redis 的 zset
和 set
一样也是 string
类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double
类型的
分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。zset
的成员是唯一的,但分数(score
)却可以重复。
ZADD
添加元素到集合,元素在集合中存在则更新对应score
ZRANGE
集合指定范围内的元素ZRANK
获取指定成员的排名ZSCORE
返回元素的权重(score
)值
ZADD key score member
redis> ZADD class 1 xiaoming
(integer) 1
redis> ZADD class 2 xiaoqiang 3 xiaogang
(integer) 2
redis> ZRANGE class 1 2
1) "xiaoming"
2) "xiaoqiang"
redis> ZRANK class xiaogang
(integer) 2
redis> ZSCORE class xiaogang
"3"
容器型数据结构 #
list/set/hash/zset
这四种都属于容器型数据结构,他们有两条通用规则:
- 如果容器不存在,那就创建一个,再进行操作。比如
RPUSH
,如果列表不存在,Redis 就会自动创建一个,然后再执行RPUSH
。 - 如果容器里元素没有了,那么立即删除 key,释放内存。比如
LPOP
操作到最后一个元素,列表 key 就会自动删除。