redis的使用
- content
{:toc}
redis,重点理解Redis可以支持的数据结构(类比Java的数据结构): String,hashMap,List,Set,SortSet(特殊)。
缓存
Redis
命令在$Redis/src 下
启动
- 直接启动
$ redis-server
默认使用6379端口,通过—port参数自定义端口号。
$ redis-server --port 6666
- 脚本启动
停止
redis-cli SHUTDOWN
配置
可以将配置作为启动参数时设置,更多的是通过配置文件进行配置。
启用的方式是,将配置文件作为参数,传递给redis-server
redis-server/path/redis.conf
同时存在配置文件和配置参数时,配置参数优先级更高。
配置文件模板redis.conf
位于源目录根目录。
另一种配置方式,可以在不重启的情况下,通过命令CONFIG SET
,
$redis>CONFIG SET loglevel warning
同样,在运行的时候也可以通过CONFIG GET
,获取当前配置 。
1 | 127.0.0.1:6379> config get loglevel |
注:不是所有配置都可以通过这种方式进行配置。
控制台
发送命令
将命令作为
redis-cli
的参数执行如:
redis-cli SHUTDOWN
,命令行执行时,自动按照more你配置(服务器地址:127.0.0.1,端口号:6379)连接redis,通-p,-h
可自定义地址和端口号redis-cli -h 127.0.0.1 -p 6379
。redis提供了redis-cli PING
用于测试客户端与Redis连接是否正常。不附带参数运行
redis-cli
,会进入交互模式。1
2
3
4
5
6liqianlongdeMacBook-Air:src liqianlong$ ./redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> echo hi
"hi"
127.0.0.1:6379>
命令返回值
有5种类型:
状态恢复
status reply,提示命令是否执行成功
错误回复
error reply,以
error
开头,并在后面跟上错误信息。如命令不存在或命令语法错误时。整数回复
integer reply,以
(integer)
字符串开头,并在后面跟上整数数据。字符串回复
bulk reply,是最常见的一种回复类型,以
“”
双引号将内容包裹。特殊情况,当不存在是,(nil)
。多行字符串回复
multi-bulk reply,很常见,每行都以一个序号开头。
多数据库
关系数据库可以通过建立不同的databases,实现不同的应用。
redis,可以这么理解,更多是像命名空间似得,分为不同的字典,字典与字典之间有分隔,也有联系。
在redis中,不支持自定义命名字典库名称,只能是默认的从0-16,且默认最多到16个字典库,通过配置参数databases
可以进行修改或查看
1 | 127.0.0.1:6379> CONFIG GET databases |
通过命令select
可以切换字典库,类似关系数据库的user xxxdatabase
命令。
字典库之间并不是完全隔离的,通过命令如FLUSHALL
会完全清空所有字典库。
所以建议不同应用应该使用不同的redis实例,同一个redis实例中不同的字典库可以用作不同的环境。
入门
Keys Pattern
符号 | 含义 |
---|---|
? | 匹配一个字符 |
* | 匹配任意个(包括0个)字符 |
[ ] | 匹配括号间指定的任意一个字符,可以使用- 表示一个范围, |
\x | 转义符号,如 \?,*, |
SET
SET bar 1
设置一个键
EXISTS
EXISTS key
判断一个键是否存在,存在返回1,否则返回0
DEL
DEL key [key ...]
删除一个或多个键,返回值为删除的数目
注:del命令不支持pattern,需要使用技巧来进行批量删除符合规则的键。
1 | $ redis-cli KEYS "user:*" | xargs redis-cli DEL |
TYPE
TYPE key
获得键值的数据类型。 返回的可能值为: string,hash,list(列表类),set,zset(有序集合类),none
LPUSH
字符串类型
增删改查
SET key value
GET key
实现了形如key="value"
的目的
INCR
INCR key
如果valu是int类型,使用此命令可进行递增,返回递增后的值。
key命名
String的key没有强制规范,推荐 对象类型:对象ID:对象属性
来命名一个键,多个单词之间使用.
进行分隔,如: post:1:page.view
,id为1的文字的浏览量
MGET、MSET
MGET key [key...]
MSET key value [key value ...]
同时获取,设置多个键值。
散列类型(Hash)
redis是一种字典结构形式存取数据的,散列类型(Hash)也是一种字典结构存取数据的。
redis中的散列类型,键值只能是字符串形式的。
redis+散列类型,构成了 键+(属性+值)
的结构,其中 属性+值
是散列类型,键+(散列类型)
是redis的字典结构。
这样就构成了一个三层结构的数据结构,通过指定 键和属性,找到值。
增删改查
HSET、HGET
HSET key field value
HGET key field
HMSET key field value [key field value ...]
HMGET key field [key field ...]
HGETALL key
HEXISTS
HEXISTS key field
判断字段是否存在
HSETNX
HSETNX key field value
当字段不存在时,设置
HINCRBY
HINCRBY key field increment
指定键+字段,增加指定数值
HDEL
HDEL key field [field ...]
删除一个或多个字段,返回删除的字段数。
列表类型(list)
列表类型内部使用的是双向链表(double linked list)实现的,
有序,类似于数组,通过一个建名,获得真个列表值。
增删改查
LPUSH key value [value ...]
RPUSH key value [value ...]
想列表左、右添加值
LPOP key
RPOP key
从列表左、右,弹出一个值 (弹出后,删除)
LLEN
LLEN key
列表个数
LRANGE
LRANGE key start stop
截取列表部分
LREM
LREM key count value
删除列表中前count个值为value的元素。
value可以为 0, 1-9,*等pattern
LINDEX
LINDEX key index
LSET key index value
返回指定key的指定index的值
LTRIM
LTRIM key start end
值保留指定索引范围内的
LINSERT
LINSERT key BEFORE|AFTER pivot value
这个插入不是根据索引来查找然后插入的,而是根据value查找后插入, 查找值为pivot的,然后插入值为value的在其前或后。
POPLPUSH
POPLPUSH source destination
移动列表到另一个个列表的左边。
集合类型(Set)
集合的概念就是数学上的概念。在集合中每个元素都是不同的,且没有顺序。
实现方式和也是通过值为null的hashtable实现的。
增删改查
SADD
SADD key member [member]
向集合中添加一个或多个元素,已经存在的会忽略,返回成功添加的个数
SREM
SREM key member [member]
删除一个或多个元素,返回删除成功的个数
SMEMBERS
SMEMBERS key
返回集合中所有元素
SISMEMBER
SISMEMBER key member
判断一个元素是否存,存在返回1,不存在返回0
集合间的运算
SDIFF
SDIFF key [key ...]
集合间 差集运算, 集合A和集合B,差集 = A-B,即 A-B = {x|x属于A & x不属于B}
{1,2,3} - {2,3,4} = {1}
1 | 127.0.0.1:6379> sadd a 1 2 3 |
SINTER
SINTER key [key ...]
集合间交集运算,集合A和集合B, A交B = {x|x属于A&x属于B}
{1,2,3} 交 {2,3,4} = {2,3}
SUNION
SUNION key [key ...]
集合间并集运算,集合A和集合B,A并B = {x|x属于A 或 x属于B}
{1,2,3} 并 {2,3,4} = {1,2,3,4}
SCARD
SCARD key
获得集合中元素的个数
SDIFFSTORE、SINTERSTORE、SUNIONSTORE
SDIFFSTORE destination key [key ...]
SINTERSTORE destionation key [key ...]
SUNIONSTORE destionation key [key ...]
求得差集、交集、并集 后将结果的结合存在 目标 key 的集合中。
SRANDMEMBER
SRANDMEMBER key [count]
随机获得集合中的count个元素。 count为正时,元素不重复。count为负时,元素可能重复。
SPOP
SPOP key
从集合中弹出一个元素,随机的,弹出后删除。
有序集合类型
sorted set,即在集合的基础上,关联了一个分数。可以实现后去前n个分数高、低的元素
增删改查
ZADD
ZADD key score member [score member ...]
向集合中添加一个或多个元素的分数和元素,
ZSCORE
ZSCORE key member
获得元素的分数,指定键和member名称。
ZRANGE
ZRANGE key start stop [WITHSCORES]
获得索引(start到stop)的元素列表。 从小到大排序。
如果需要同时获取元素的分数,加上
ZRENRANGE
ZREVRANGE key start stop [WITHSCORES]
获得索引在某个范围的元素列表。 从大到小。
ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORES][ LIMIT offset count]
排名在某个范围内的元素。 +inf
,-inf
分别表示分数无穷大和无穷小。
LIMIT offset count
和关系数据库类似。
ZREVRANGEBYSCORE
用于从大到小。
ZINCRBY
ZINCRBY key increment member
增加一个元素的分数
ZCARD
ZCARD key
集合中元素的数量
ZCOUNT
ZCOUNT key min max
指定分数范围元素的个数
ZREM
ZREM key member [member ...]
删除
ZREMRANGEBYRANK
ZREMBREANGEBYRANK key start stop
删除指定索引范围内的所有,从小到大排序
ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max
指定分数范围内所有元素
ZRANK
ZRANK key member
zrevrank key member
获得指定元素排名。
ZINTERSTORE
ZINTERSTORE destination numkeys key [key...] [WEIGHTS weight [weight...]][AGREGATE SUM|MIN|MAX]
计算多个有序集合的交集,并存储在destination集合内。
计算后的分数,根据 Agregate 参数决定。sum为求和,min为去较小值。
权重 weights ,集合在计算分数时,会乘以此权重。
ZUNIONSTORE
计算有序集合间的并集。
事务
MULTI ... EXEC
事务中发生错误
- 语法错误,不会执行
- 运行时错误,会执行
如果出现运行时错误,只能自己手动回滚 。
WATCH
EXPIRE
EXPIRE key seconds
设置已经存在的键,seconds秒后删除。
TTL key
查看key剩余时间
PERSIST foo
将目标key设置为永久生存。
PEXPIRE key seconds*1000
用毫秒设置剩余时间
PTTL key
毫秒返回剩余时间
EXPIREAT key
使用unix时间戳,设置key的截止时间
PEXPIREAT key
使用unix时间戳*1000毫秒设置截止时间
BRPOP
BRPOP queue,seconds
队列,弹出元素,如果队列没有元素,则等待seconds秒,直到有元素则弹出,没有返回nil。
当seconds设置为0时,则永久等待。
BLPOP
参照brpop,一个从队列左侧取得,一个从队列右侧取得。
优先级
BRPOP queue1 [queue2 queue3 ...] timeout
可以使用阻塞弹出方式,监听多个队列,此时,队列的先后顺序是有序的。 且每次只会弹出一个队列的元素。
发布、订阅
PUBLISH channel1 [channel2 ...] message
SUBSCRIBE channel [channel ...]
订阅频道, 可以订阅多个。
返回值:
- Subscribe, 表示订阅成功。 第二行,显示订阅的频道名称。 第三行,表示当前客户端订阅的频道数目。
- message,表示接收到的消息。 第二行,显示产生消息的频道。第三行,消息内容。
- unsubscribe,表示成功取消某个频道订阅。第二行表示取消的频道的名称,第三行,当前客户端剩余频道数目,此值为0时,会推出订阅模式。
SUBSCRIBE
订阅 指定频道名称的 频道。
UNSUBSCRIBE
PSUBSCRIBE
订阅 指定规则的 频道,支持glob风格。