redis
intro
- redis 是一个 key-value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(有序集合)、hash、位数组、HyperLogLogs 和流。这些数据类型都支持push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave (主从) 同步。
install
-
安装
使用 homebrew 安装:
brew install redis
To have launchd start redis now and restart at login:
brew services start redis
-
Or, if you don't want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
配置文件位置:
/usr/local/etc/redis.conf
-
启动
- 启动 redis:
redis-server
/redis-server /usr/local/etc/redis.conf
- 连接 redis:
redis-cli -h 127.0.0.1(ip) -p 6379(port)
- 测试 redis 是否启动:
redis-cli ping
- 键入授权登录密码:
127.0.0.1:6379> auth 123456(password)
- 退出本次会话:
127.0.0.1:6379> quit
- 关闭 redis:
redis-cli shutdown
(单实例关闭)redis-cli -p 6379 shutdown
(多实例关闭,指定端口 6379 关闭)
- 启动 redis:
-
常用命令
- 开机启动 redis:
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
- 使用 launchctl 自启动 redis server:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
- 停止 redis server 的自启动:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
- 开机启动 redis:
data types
- 二进制安全字符串
- 链表
- 无序集合
- 有序集合
- 哈希表,key 和 value 都是 string
- 位数组
- HyperLogLogs:这是一个概率数据结构,用于估计集合的基数
- 流:提供抽象日志数据类型的类地图项的仅追加集合
-
key
- 允许的最大 key 大小为512 MB
- 单字段:
"object-type:id"
- 多字段可以用点或者减号连接:
"comment:1234:reply.to" or "comment:1234:reply-to"
-
exist mykey
返回1或0表示数据库中是否存在给定的键 -
del mykey
删除 key 和关联的 value -
type mykey
返回 key 对应的 value 的类型 -
expire mykey 5
可以设置 key 的过期时间,默认单位为秒,set key 100 ex 10
可以在初始化的时候设置过期时间,可以使用persist
删除过期时间,使用ttl mykey
可以查看剩余过期时间
-
字符串
- Memcached 中只有 string 这个一种数据类型
-
set mykey somevalue
get mykey
-
getset
会设置新的 value 并返回旧的 value -
mset
mget
可以批量进行 set 和 get 操作,mget
返回 value 数组 -
set mykey newval nx
当 mykey not exist 时才 set 成功,set mykey newval xx
则与之相反 -
set counter 100
incr counter
incrby counter 20
数值类可以做加减,类似的还有decr
decrby
并且操作是原子性的
-
链表
- 在列表的开头或结尾添加新元素的操作会在固定时间内执行,另一个强大的优势是 Redis 列表可以在恒定的时间内以恒定的长度获取元素
-
lpush mylist A
rpush mylist B
分别向链表的头部和尾部追加元素,lrange mylist 0 -1
列举了列表中所有的元素,相应的还有rpop
和lpop
-
lpush mylist 1 2 3 4 5
ltrim mylist 0 2
仅从索引0到2列出列表元素,其他所有内容都将被丢弃,没有rtrim
-
brpop/blpop tasks 5
意思是wait for elements in the list tasks, but return if after 5 seconds no element is available
, 返回值是包含两个元素的数组 (key, value),brpop list1 list2 0
其中 0 表示一直等待,并且该命令可以同时等待两个链表 - 常见用例:
- 记住用户发布到社交网络上的最新更新。
- 使用生产者将项目推送到列表中的消费者与生产者模式进行流程之间的通信,而消费者(通常是worker)消耗这些项目和已执行的动作。Redis具有特殊的列表命令,以使此用例更加可靠和高效。
-
Redis 可以自动创建和删除 key
- 当我们将元素添加到聚合数据类型时,如果目标键不存在,则在添加元素之前会创建一个空的聚合数据类型。
- 当我们从聚合数据类型中删除元素时,如果该值保持为空,则键将自动销毁。流数据类型是此规则的唯一例外。
- 调用带有空键的只读命令(例如LLEN(返回列表的长度))或写命令删除元素,总会产生与键保持空的聚合类型相同的结果。
-
哈希
-
hmset user:1000 username antirez birthyear 1977 verified 1
,hmset
命令设置哈希的多个字段,而hget
检索单个字段。hmget
类似于hget
但返回值的数组。 -
hincrby user:1000 birthyear 10
对单个字段执行加法操作,类似的还有hincrbyfloat
,没有hdecrby
-
-
无序集合
-
sadd myset 1 2 3
添加元素 -
smembers myset
输出所有元素 -
sismember myset 2
是否包含这个元素 -
sinter set1 set2
输出两个集合的交集(intersection) -
sunionstore set1 set2
将两个集合的并集放入set1
中 -
scard set1
返回集合中目前的元素数,通常称为集合的基数 -
srandmember myset
与spop
类似,但是不会删除集合中的元素 -
srandmember myset 4
,如果 set 元素数小于 4,则输出所有的元素不重复,如果大于 4,就输出 4 个 -
srandmember myset -4
,不管元素有几个,都输出 4 个,并且结果可能会有重复
-
-
有序集合
- 每个元素都有一个 score 与之绑定,若 a.score > b.score 则 a>b,若二者的 score 相等,则按照把字母序比较字符串,a 和 b 一定不相等。
-
zadd myzset 40 val
zadd myzset 41 "val more"
向 set 中添加元素,立即排序 O(log(n)) 的复杂度 -
zrange myzset 0 -1 withscores
zrevrange myzset 0 -1
顺序/倒序输出 set 中的元素,withscores
会返回 score -
zrangebyscore myzset -inf 40
返回 score 在负无穷大和1950之间的所有元素(前闭后闭区间) -
zremrangebyscore myzset 30 40
删除区间内的元素,并返回删除的元素个数 -
zrank myzset val
返回当前元素的下标 - Redis 2.8 引入了按字典顺序获取范围的功能,当 score 相同时,按字典顺序排序,
zrangebylex hackers [B (P
表示 前闭后开 区间内的元素 -
zadd
可以对排序集合随时更新
-
位数组
- 位操作分为两种,一种是对单个 bit 的更改、获取,另一种是对一组 bit 的操作,例如计算给定范围内设置为的数量
- 单个 bit:
setbit mykey offset value
offset
必须大于等于0,小于 2^32 (512MB)getbit mykey 20
- 对一组 bit: 在不同的字符串之间执行按位运算:
bitop and/or/xor dest key1 key2 key3
bitop not dest key1
,执行填充计数,报告设置为1的位数:bitcount key1
,查找指定值为0或1的第一位:bitpos key1
- 常见用例:各种实时分析;存储与对象ID相关联的空间高效但高性能的布尔信息。
-
HyperLogLogs
一种概率数据结构,用于对唯一的元素进行计数,得到的是近似值,误差小于1%
> pfadd hll a b c d (integer) 1 > pfcount hll (integer) 4
流