该篇文章系统性的介绍redis的特点及常见使用场景,通过实际操作着重介绍了String、Set、Hash、SortedSet、List常见数据结构命令的使用,以及在实际开发中如何更好更高效的使用redis。
Redis安装请参考:
2、Windows环境安装Redis,使用MSI安装包方式安装
3、windows环境下安装Redis,zip包简单快速安装
更多命令的使用说明请参考:Redis命令速查与参考手册
Redis是一个开源的、基于内存的结构化存储媒介,可用作数据库、缓存、消息中间件。
它支持strings、hash、set、list、sorted set、bitmaps、hyperloglogs、geo数据结构。
另外,Redis还提供了如下的功能:
几乎所有的大型系统都会用到缓存,合理地使用缓存不仅可以加速数据的访问速度,同时也可以降低后端数据源的压力。
比如说某些网站需要对一篇文章的阅读量需要进行计数,参照数据结构:incr/incrby(原子性).
比如获取某用户最新发布的N条文章,这个时候就可以考虑使用redis,参照数据结构:List(lpush+ltrim).
基于不同维度的数据的排序,参照数据结构sortedset和list .
首先,Redis 针对 strings、list、set、zset、hash 这5种数据结构每种结构底层都对应有至少2种以上的内部编码实现,这样做一来是为了方便内部编码重构时不会影响外部数据结构的操作,另一方面是在键对应的数据量较小时节省内存。
redis 有0~15 个数据库,默认为db.
以下操作在redis-server:V3.2.8 ,客户端:redis-cli上执行.
keys *
时间复杂度O(n),该命令不建议在生产环境使用,当key较多的时候会阻塞redis,建议使用替代命令scan、hscan、sscan、zscan。
2.查看当前db键总数
Dbsize
3、检查键是否存在,存在返回1、不存在返回0
exists $key
存在则返回1、不存在返回0
4、删除键
del $key
通用命令返回结果为删除成功的键个数,删除不存在的key返回0,支持一次删除多个键
5、键过期
Expire $key $seconds
当为key设置了过期时间,超过过期时间后,键会被删除;另可使用ttl命令查看对应的剩余过期时间,返回值有以下3种:
类似的为key设置过期时间的命令还有pexpire、expireat、pexpireat.
6、键的类型
Type $key
当键不存在时,返回none.
7、查看键对应的内部编码
object encoding $key
Redis里键都是字符串类型,官方给出的值最大不超过512MB,但是实际使用中建议字符串长度最好不超过1K。
这里,重点介绍下常用的几个命令.
1、设置一个字符串
Set $key $value [expiration EX seconds |PX milliseconds] [NX|XX]
NX表示键不存在时,写入该key,XX表示键存在时写入(实际就是更新操作).
这里要注意下,如果第一次set了一个key并设置了过期时间,那么再次针对该key执行set操作的话,该key之前的过期时间会被清空.
2、获取键的值
Get $key
返回对应键的值,返回nil如果键不存在
3、批量SET
Mset $key $val [$key $val …]
该操作是原子性的.
这里同样要注意,如果mset中的某个键存在于当前DB中的话,会用新的值替换掉旧的值,过期时间也会被清除(如果存在的话);如果想要在键不存在的情况下,批量写入,请使用msetnx 命令.
4、批量get
Mget $key [$key …]
当给定的键不存在或者键类型不是字符串的话,对应键返回特殊值nil.
使用批量操作,可以提高开发效率,节省来回的网络时间,但是要注意,批量操作的命令数不宜过多,过多会阻塞redis.
5、计数
Incr/incrby/incrbyfloat、decr/decrby
当键对应的val为整数时,执行成功.
Hset $key $field $val
当新增一个field时,返回结果为1,当更新了一个已经存在的field时,返回0.
2、获取field值
hget $key $field
field存在,返回对应的值,反之返回nil.
3、批量设置或者获取field
hmset $key $field $val [$field $val …]
hmget $key $field [$field …]
4、删除field
hdel $key $field
5、获取键的所有键值对/键/值
hgetall $key
hkeys $key
hvals $key
6、field是否存在
hexists $key $field
键不存在或者field不存在时,返回0.
redis的列表是双端链表,可以再两端进行push、pop操作,一个列表最多可以存2^32-1 个元素。
lpush $key val [val …] 向列表左侧(头部)插入元素
rpush $key val [val …] 向列表右侧(尾部)插入元素
2、删除元素
lpop $key 从列表头部删除一个元素
rpop $key 从列表尾部删除一个元素
3、获取列表元素个数
llen $key
4、获取指定范围内的元素
lrange $key $start $end
$start、$end额外说明:0表示列表的第一个元素、1表示第2个元素,-1表示列表的最后一个元素,-2表示倒数第二个元素等等。
5、清空列表
ltrim $key $start $end
严格满足 $start、$end >0 && $start >$end.
6、阻塞式的删除列表元素
blpop $key [$key …] $timeout
brpop $key [ $key …] $timeout
如果超时,则返回nil.
7、列表间的移除增加操作
rpoplpush $source $destination
将$source列表的最后一个元素从source移除后添加到destination的头部,若$source为空,则不进行任何操作.
该命令也有阻塞式的操作brpoplpush,详情参见https://redis.io/commands/brpoplpush.
基于列表以上操作,我们可以通过列表的命令组合来实现一些常用数据结构,例如:lpush+lpop 实现栈,lpush+rpop实现队列等.
sadd $key $member [ $member …]
2、获取集合中元素个数
scard $key
3、获取集合中的所有元素
smembers $key
4、判断一个元素是否在集合内
sismember $key $member
5、删除集合中的元素
spop $key [$count]
6、集合间求交集、并集等
sinter $key [$key …]
sinterstore $destination $key [$key …]
sunion $key [$key …]
sunionstore $destination $key [$key …]
sdiff $key [$key …]
sdiffstore $destination $key [$key …]
有序集合中的每一个元素有一个score作为排序依据,切记有序集合中的元素不能重复,但是score可以重复。
zadd $key [nx|xx] [ch] [incr] $score $member [$score $member …]
2、返回有序集合内元素个数
zcard $key
3、计算某个成员的分数
zscore $key $member
4、计算某个成员的排名
zrank $key $member 分数从低到高排名
zrevrank $key $member 分数从高到低排名
5、指定排名范围内的成员
zrange $key $start $end [withscores]
zrevrange $key $start $end [withscores]
6、有序集合内的元素删除
zrem $key $member [$member …]
7、删除指定分数范围内的元素
zremrangebyscore $key $min $max
slowlog-log-slower-than 定义当命令处理时间超过多少,该命令会被记录在慢查询列表中
slowlog-max-len 定义慢查询列表的大小
2、连接空闲多久会被server关闭回收掉
timeout 定义当前连接空闲多久会被server主动关闭掉。
3、输出缓冲区配置
client-output-buffer-limit:该配置项定义了针对不同类型的客户端的输出缓冲区的大小(hard limit 和 soft limit 两部分),例如:normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60 :对于normal节点来说,输出缓冲区没有限制;对slave节点来说,当输出缓冲区大于256MB或在60s内持续大于64MB,该连接会被server端主动关闭掉,这个在线上使用的时候一定要注意根据业务量进行修改。这里额外说下,这里的输出缓冲区指的是输出缓冲区的变长缓冲区即动态链表部分。
4、最大连接数
maxclients:定义redis server 允许的最大客户端连接数,当连接数超过该值时,会报类似 ‘-ERR max number of clients reached’ 错误.
Redis-server所在服务器参数:Rhel 6.5 ,内存 256G,CPU: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。