准备
Redis安装
不在赘述、各种环境各种版本网上随便一搜都可以
启动
1 | redis-server redis.windows.conf |
Redis 命令行客户端
1 | redis-cli -h IP -p port |
入门
常用命令
获得符合规则的键名列表
1
KEYS pattern
判断一个键是否存在
1
EXISTS key
删除键
1
DEL key [key ....]
获取键值得数据类型
1
TYPE key
字符串类型
Redis 中最基本的数据类型,他能存储任何形式的字符串,最大容量512M
命令
赋值与取值
1
2SET key value
GET key递增数字
1
INCR key
增加指定的整数
1
INCRBY key increment
减少指定的整数
1
2DECR key
DECRBY key decrement增加指定浮点数
1
INCRBYFLOAT key increment
向尾部追加值
1
APPEND key value
获取字符串长度
1
STRLEN key
同时获得/设置多个键值
1
2MGET key [key ...]
MSET key value [key value ...]位操作
1
2
3
4GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP operation destkey key [key ...]
实践
命名(推荐):对象类型:对象ID:对象属性(例:user:1:friends)
使用示例
1 | redis 127.0.0.1:6379> set baidu http://www.baidu |
散列类型(字典,哈希表)
Redis采用字典结构以键值对的形式存储数据的,散列类型的键值也是一种字典结构,其存储了字段和字段值得映射,一个散列类型键可以包含2的32次-1个字段
命令
赋值与取值
1
2
3
4
5HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL keyHSET 不区分插入和更新,修改数据是不必判断字段是否存在
判断字段是否存在
1
HEXISTS key field
当字段不存在时赋值
1
HSETNX key field value
增加数字
1
HINCRBY key field increment
删除字段
1
HDEL key field [field ...]
只取字段名或字段值
1
2HKEYS key
HVALS key获得字段数量
1
HLEN key
使用示例
1 | 127.0.0.1:6379> hset person name jack |
列表类型
可以存储一个有序的字符串列表,常用的操作是向列表良多添加元素,或者获得列表中的某一段
命令
向列表两端添加元素
1
2LPUSH key value [value ...]
RPUSH key value [value ...]从列表两端弹出元素
1
2LPOP key
RPOP key获取列表中元素的个数
1
LLEN key
获得列表片段
1
LRANGE key start stop
删除列表中指定的值
1
LREM key count value
获得/设置指定索引的元素值
1
2LINDEX key index
LSET key index value只保留列表指定片段
1
LTRIM key start end
向列表中插入元素
1
LINSERT key BEFORE|AETER pivot value
将元素从一个列表转移到另一个列表
1
RPOPLPUSH source destination
使用示例
1 | redis 127.0.0.1:6379> lpush list1 redis |
集合
可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
命令
添加一个或者多个元素到集合(set)里
1
2SADD
SADD key member [member ...]获取集合里面的元素数量
1
2SACRD
SCARD key获得队列不存在的元素
1
2SDIFF
SDIFF key [key ...]获得队列不存在的元素,并存储在一个关键的结果集
1
2SDIFFSTORE
SDIFFSTORE destination key [key ...]获得两个集合的交集
1
2SINTER
SINTER key [key ...]获得两个集合的交集,并存储在一个集合中
1
2SINTERSTORE
SINTERSTORE destination key [key ...]确定一个给定的值是一个集合的成员
1
2SISMEMBER
SISMEMBER key member获取集合里面的所有key
1
2SMEMBERS
SMEMBERS key移动集合里面的一个key到另一个集合
1
2SMOVE
SMOVE source destination member获取并删除一个集合里面的元素
1
2SPOP
SPOP key [count]从集合里面随机获取一个元素
1
2SRANDMEMBER
SRANDMEMBER key [count]从集合里删除一个或多个元素,不存在的元素会被忽略
1
2SREM
SREM key member [member ...]添加多个set元素
1
2SUNION
SUNION key [key ...]合并set元素,并将结果存入新的set里面
1
2SUNIONSTORE
SUNIONSTORE destination key [key ...]迭代set里面的元素
1
2SSCAN
SSCAN key cursor [MATCH pattern] [COUNT count]
有序集合
一个有序集合的每个成员带有分数,用于进行排序。
Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)
Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
使用场景
用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。
命令
添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
1
2ZADD
ZADD key score1 member1 [score2 member2]得到的有序集合成员的数量
1
2ZCARD
ZCARD key计算一个有序集合成员与给定值范围内的分数
1
2ZCOUNT
ZCOUNT key min max在有序集合增加成员的分数
1
2ZINCRBY
ZINCRBY key increment member多重交叉排序集合,并存储生成一个新的键有序集合。
1
2ZINTERSTORE
ZINTERSTORE destination numkeys key [key ...]计算一个给定的字典范围之间的有序集合成员的数量
1
2ZLEXCOUNT
ZLEXCOUNT key min max由索引返回一个成员范围的有序集合(从低到高)
1
2ZRANGE
ZRANGE key start stop [WITHSCORES]返回一个成员范围的有序集合(由字典范围)
1
2ZRANGEBYLEX
ZRANGEBYLEX key min max [LIMIT offset count]返回有序集key中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员,有序集成员按 score 值递增(从小到大)次序排列
1
2ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]确定成员的索引中有序集合
1
2ZRANK
ZRANK key member从有序集合中删除一个或多个成员,不存在的成员将被忽略
1
2ZREM
ZREM key member [member ...]删除所有成员在给定的字典范围之间的有序集合
1
2ZREMRANGEBYLEX
ZREMRANGEBYLEX key min max在给定的索引之内删除所有成员的有序集合
1
2ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop在给定的分数之内删除所有成员的有序集合
1
2ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分
1
2ZREVRANGE
ZREVRANGE key start stop [WITHSCORES]返回一个成员范围的有序集合,以socre排序从高到低
1
2ZREVRANGEBYSCORE
ZREVRANGEBYSCORE key max min [WITHSCORES]确定一个有序集合成员的索引,以分数排序,从高分到低分
1
2ZREVRANK
ZREVRANK key member获取给定成员相关联的分数在一个有序集合
1
2ZSCORE
ZSCORE key member添加多个集排序,所得排序集合存储在一个新的键
1
2ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...]增量迭代排序元素集和相关的分数
1
2ZSCAN
ZSCAN key cursor [MATCH pattern] [COUNT count]
使用示例
1 | redis 127.0.0.1:6379> zadd dbs 100 redis |
事务
概述:
Redis中的事务十一组命令的集合 将属于一个事物的命令先送给Redis,然后再让Redis一次执行这些命令
使用示例
1 | 127.0.0.1:6789> MULTI |
错误处理
- 语法错误:不存在或参数不对
- 执行EXEC命令后Redis就直接返回错误,正确的命令也不会执行
- 运行错误:使用不同类型命令
- 错误命令之前命令不执行 之后命令会执行
- Redis 无回滚
watch 命令介绍
概述:watch 命令可以监控一个或多个键,一点其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)
示例
1 | 127.0.0.1:6789> SET demo 1 |
过期时间
设置过期时间
1
2EXPIRE
EXPIRE key sconds查看过期时间(不存在返回-2,键没有过期时间-1)
1
2TTL
TTL foo
实现访问频率限制之一
示例:
1
2
3
4
5
6
7
8
9
10
$isKeyExists = EXISTS rete.limiting:$IP
if $isKeyExists is 1
$times = INCR rate.limiting:$IP
if $times > 100
print 访问超限 稍后重试
else
MULTL
INCR rate.limiting:$IP
EXPIRE $keyName, 60
EXEC
实现访问频率限制之二
示例:
1
2
3
4
5
6
7
8
9
10
11
12
$listLength = L:EN rate.limiting:$IP
if $listLength < 10
LPUSH rate.limitingL$IP, now()
else
$time = LINDEX rate.limiting:$IP, -1
if now() - $time < 60
print 超过限制
else
LPUSH rate.limiting:$IP, now()
LTRIM rate.limiting:$IP, 0, 9
// now() 获得当前Unix时间