Redis 日常操作
words: 3.3k views: time: 13min官方文档:https://redis.io/commands/
Remote Dictionary Server远程字典服务,是一个开源的使用C语言编写的Key-Value数据库。redis是一个基于内存的存储系统,当然也支持持久化,它会周期性的把更新的数据写入磁盘(RDB)或者把修改操作追加的记录文件(AOF),并在此基础上实现master-slave(主从)同步。所以redis可以用于高速缓存(内存&多路复用IO),同时它支持多种数据类型,以及集群和事务的操作,进而也可以用于发布订阅、地图信息分析、计数器等系统
redis.conf
Redis安装很简单,官网下载安装包后直接解压执行:make install,安装完之后在目录 \usr\local\bin 下可以看到redis的可执行文件
然后修改配置redis.conf,并在启动时需要指定配置文件,比如:redis-server /path/to/redis.conf,当然也可以用多个配置文件启动多个redis实例
以下是一个配置模板,并忽略了部分不常用的配置
1 | ################################################## INCLUDES ################################################# |
常用操作
redis自带客户端,通过 redis-cli -h 127.0.0.1 -p 6379 便可以连接本地实例,然后进行操作,所有的操作都是原子的
db 操作:
select 3 | 切换数据库 |
dbsize | 查看当前库大小 |
flush db | 清空当前数据库 |
flushall | 清空所有数据库 |
key 操作:
keys * | 获取所有的key |
exists key | 是否存在key |
move key 1 | 从数据库1中删除key |
type key | 查看key类型 |
expire key 10 | 设置key过期时间 |
ttl key | 查看key剩余时间 |
String 操作:
set key value | 设置key的值 |
get key | 获取key的值 |
mset k1 v1 k2 v2 k3 v3 | 设置多值 |
mget k1 k2 k3 | 获取多值 |
setnx key value | 如果当前key不存在,则设置成功 |
msetnx k1 v1 k2 v2 | 如果当前key不存在,则设置成功(一个失败则全部失败) |
getset key value | 返回当前值,并设置新值 |
setex key 10 value | 设置key的值,并设置10秒过期时间 |
strlen key | 查看key对应值的长度 |
append key value | 在key的值后面拼接字符串,如果key不存在则相当于set |
setrange key 2 value | 设置key的值,并从位置2开始的地方进行覆盖 |
getrange key 0 5 | 获取key的值,并截取位置0-5 |
incr key | key的值+1 |
decr key | key的值-1 |
incrby key 10 | key的值+10 |
decrby key 10 | ey的值-10 |
场景:使用mset/mget存取对象,相对直接存取json可以更灵活的操作,比如存取人员信息
1 | mset user:1:name shanhm user:1:age 30 user:1:sex man |
List 操作:
lpush key v1 v2 | 从头部向列表中放入值 |
rpush key v3 v4 | 从尾部向列表中放入值 |
lpop key | 从头部弹出值 |
rpop key | 从尾部弹出值 |
lindex key index | 根据索引获取值 |
lrange key 0 1 | 按照索引(首尾)获取多值 |
llen key | 获取列表长度 |
lrem key count value | 从列表中移除指定个数(count)的值(value) |
ltrim key index count | 根据下标(index)截取(count)个元素,改变原列表 |
lset key index value | 更新列表指定位置的值,前提key列表已经存在,且index存在 |
linsert key before|after v1 v2 | 在v1的前后插入值v2 |
rpoplpush key1 key2 | 组合命令:将列表key1中的尾部元素移到列表key2头部 |
redis中的list本质上是一个双向链表,其结构如下:
1 | typedef struct listNode { |
Set 操作:
sadd key value | 向set中添加元素,如果已存在则失败 |
srem key value | 从set中移除值 |
smembers key | 查看set中所有元素 |
sismember key value | 查看set(key)中是否存在元素value |
scard key | 查看set的元素个数 |
srandmember key | 从set中随机抽取1个元素 |
srandmember key n | 从set中随机抽取n个元素 |
spop key | 随机删除一个元素 |
smove k1 k2 value | 将k1中的值移到k2中 |
sdiff k1 k2 | 取k1与k2的差集(在k1中,不在k2中) |
sinter k1 k2 | 取k1和k2的交集 |
sunion k1 k2 | 取k1和k2的并集 |
Hash 操作:
hset key field value | 设置map的字段值 |
hget key field | 获取map指定字段的值 |
hgetall key | 获取map所有字段-值 |
hdel key field | 删除map指定的字段 |
hmset key field1 value1 field2 value2 | 设置map多个字段值 |
hmget key field1 field2 | 获取map多个字段的值 |
hlen key | 获取map的字段数 |
hexists key field | 查看map是否存在字段 |
hkeys key | 获取map所有字段 |
hvals key | 获取map所有字段值 |
map支持string中类似的操作,比如 setnx 对应 hsetnx,incrby 对应 hincrby
Zset 操作
zset即有序集合,可以给定score以便排序
zadd key score value | 设置值,指定score |
zadd key score1 value1 score2 value2 | 设置多个值 |
zrange key 0 1 withscores | 按索引排序获取 |
zrevrange key 0 -1 withscores | 按索引倒叙获取 |
zrangebyscore key -inf +inf withscores | 按score排序获取(指定区间) |
zrevrangebyscore key 500 100 withscores | 按score倒叙获取(指定区间) |
zrem key value | 删除指定元素 |
zcard key | 获取元素个数 |
acount key score1 score2 | 获取指定区间元素个数 |
geospatial 操作:
地理位置集合(经度 纬度 value),其底层也是通过zset来实现的,所以支持zset的所有命令,比如可以通过zrange
排序获取位置,或者zrem
删除位置
geoadd key 116.40 39.90 beijing | 添加城市北京 |
geopos key beijing | 获取指定城市位置 |
geodist key beijing shanghai 单位 | 获取两个位置距离,单位(m/km/mi英里/ft英尺) |
georadius geodist key 经度 纬度 半径 单位 withcoord count | 获取指定位置(坐标)指定半径内的位置 |
georadius geodist key beijing 半径 单位 withcoord count | 获取指定位置指定半径内的位置 |
hyperloglog 操作
基数统计算法,就是统计集合中不重复的元素个数。通常也许可以通过set去重来count,但对于超大集合的内存消耗显然是不能接受的,这时hyperloglog算法可以保证只消耗12kb内存的情况下估算出集合基数,而且出错率只有0.81%
pfadd key value ... | 添加元素,可多值 |
pfcount key | 获取基数 |
pfmerge key3 key1 key2 | 合并key1集合,key2集合,结果为key3集合 |
bitmaps 操作:
位图,即位存储,只保存0和1两个状态
setbit key 0 1 | 设置第0位为1 |
setbit key 1 0 | 设置第1位为0 |
getbit key 1 | 获取第1位值 |
bitcount key | 统计值为1的位数 |
事务操作:
redis事务即一组命令集合,将所有命令序列化,然后按照顺序执行,所以只有在发起执行命令时事务才开始进行,它可以保证一次性、顺序性、排他性,但是没有事务隔离级别的概念。另外,如果命令错误则直接放弃,而如果是命令执行失败则正常进行。
1.开启事务(multi)
2.命令入队(…)
3.执行事务(exec) 或者 放弃事务(discard)
乐观锁:
可以通过 watch 在事务开启前对key的值进行监视,如果在事务执行时发现key的发生变化,则事务失败,一般如果失败之后,会在再次监视之前会先解除锁以便获取最新的值进行监视
1.解除锁(unwatch)
2.监视乐观锁(watch key)
3.开启事务(multi)
4.命令入队(…)
5.执行事务(exec)
参考: