潍坊市论坛

首页 » 分类 » 定义 » redis必会基础命令数据结构lua
TUhjnbcbe - 2021/8/13 21:03:00
导读

本文介绍日常工作中redis的使用,涉及到redis的数据结构、对应的命令、持久化配置和Lua脚本,以及基于redis的分布式锁实现方案,使用redis时这些都是必会的基础知识,建议保存以下命令

通用命令

#查看当前库中key的数量dbsize#清空当前库flushdb#清空所有库flushall#查看当前库下所有keykeys*#当前库下是否有指定keyexistskey1#查看key的值类型typekey1#删除keydelkey1#设置指定key的过期时间,单位秒expirekey#查看key的剩余过期时间,-1表示永不过期,-2表示已过期ttlkey1#监视keywatchkey1#取消监视keyunwatchkey1数据结构和命令string

是key/value的数据结构,一个key对应一个string类型的value,单个value最大M

这个是最常用的数据结构了

命令

#设置key/valuesetkey1value1#设置key/value的同时设置过期时间setexkeyvalue1#获取key的值getkey1#设置新值,同时返回旧值getsetkey1value1#一次设置多个key/value,后面的....表示还可以写key3value3等msetkey1value1key2value2...#一次获取多个key的值mgetkey1key2#追加内容到指定key的值后面appendkey1xxx#获取值的长度strlenkey1#只有在key不存在时才成功setnxkey1value1#只有在所有key不存在时才成功msetnxkey1value1key2value2...#给指定key的值加1incrkey1#减1decrkey1#给指定key的值加指定数值,本例是加2incrbykey12#给指定key的值减指定数值,本例是减2decrbykey12#获取指定key的值中指定范围的字符,如值为abcdefg,取1至2返回bc,即包含1和2两个位置的字符getrangekey#设置指定位置的值,指定开始位置,然后直接覆盖,如下例中值为abcdefg,从第1个位置开始覆盖为cb,则结果为acbdefgsetrangekey11cblist

双向链表,无序可重复的集合,一般用来做队列

命令

#从表头添加元素,value2是新的表头lpushkey1value1value2...#从表尾添加元素,value2是新的表尾rpushkey1value1value2...#从表头弹出元素lpopkey1#从表尾弹出元素rpopkey1#从key1表尾弹出一个元素,再加到key2表头rpoplpushkey1key2#从表中查看指定索引的范围的元素lrangekey#查看整个链表lrangekey-1#获取链表中从左向右指定索引的元素lindexkey11#获取链表中最后一个元素lindexkey1-1#获取链表长度llenkey1#向链表中的value1前面插入value2linsertkey1beforevalue1value2#向链表中value1后面插入value2linsertkey1aftervalue1value2#从链表中删除一个值为value1的元素,从左向右lremkey11value1#从链表中删除一个值为value1的元素,从右向左lremkey1-1value1#删除链表中所有值为value1的元素lremkey10value1set

无序不可重复的集合,常用来排除重复数据和随机抽奖功能

命令

#向集合中添加元素,重复元素会自动跳过saddkey1value1value2...#取出集合所有元素smemberskey1#判断集合中是否存在某个元素sismemberkey1value1#获取集合中的元素个数scardkey1#从集合中删除指定元素sremkey1value1value2...#随机从集合中弹出一个元素并删除该元素spopkey1#随机从集合中取出元素,但不会删除元素,后面的1表示取出元素的个数srandmemberkey11#求两个集合交集sinterkey1key2#求两个集合并集sunionkey1key2#求两个集合差集sdiffkey1key2zset

有序不可重复的集合,常用来做排行榜

命令

#添加元素,相同value不同score会覆盖scorezaddkey1score1value1score2value2#获取元素数量zcardkey1#取出全部元素,从小到大zrangekey10-1#取出部分元素,从小到大zrangekey#取出全部元素,从大到小zrevrangekey10-1#取出部分元素,从大到小zrevrangekey#取出score在指定范围内的元素,从小到大,其中min和max是score的范围zrangebyscorekey1minmaxwithscores#取出score在指定范围内的元素,从大到小zrevrangebyscorekey1maxminwithscores#为指定value的元素的score递增,其中1是每次递增多少,可以为负数zincrbykey11value1#删除指定元素zremkey1value1#统计集合中score在范围内的元素个数zcountkey1minmax#返回指定值在集合中的排名,从小到大,排名从0开始zrankkey1value1#返回指定值在集合中的排名,从大到小zrevrankkey1value1hash

类似于Java中的MapString,String

命令

#添加一个键值对hsetkey1field1value1#获取键值hgetkey1field1#批量设置键值对hmsetkey1field1value1field2value2...#检查键是否存在hexistskey1field1#获取所有键hkeyskey1#获取所有值hvalskey1#键值递增,后面的1表示每次递增多少,可以为负数,当是负数时表示递减hincrbykey1field11#键不存在时成功hsetnxkey1field1value1#获取所有键值对,奇数为键,偶数为值hgetallkey1bitmap

bitmap以bit为单位设置各个位的值(要么是0,要么是1),根据实际应用场景可以设计出节省空间的算法,如布隆过滤器,本文以记录用户签到为例,假设用户ID为1,每年一个key,并且key=用户ID_年份,如1_

ID=1的用户在-01-01这一天签到,这一天是年第1天(也就是第0天),可以执行以下命令,保存签到记录

#设置1_这个key的第0个bit值为1,以此表示第0天签到成功setbit1_01

该用户在-01-03这一天签到,则执行以下命令

#设置1_这个key的第2个bit值为1,以此表示第2天签到成功setbit1_21

现在想查询该用户在年的签到情况,可通过get命令实现

get1_#输出\xa0

get命令输出0xa0,这是十六进制,转成二进制,就是,二进制中为1的位就表示那一天签到了,所以第0天和第2天签到了

判断该用户-01-03是否签到

getbit1_2

统计该用户年有多少次签到,实际上是统计有多个位是1

bitcount1_#输出2

统计该用户指定日期范围内的签到次数,这个不太好实现,redis提供的命令中指定范围的单位是byte,比如统计年1月的次数,就是第0个字节到第3个字节(第共4个字节),这样多统计了1天,即把-02-01这一天也统计进来,如下:

#统计第0到第3个字节中为1的位个数,包含第3个字节bitcount1_03

这种情况要么按月来设定key值,要么单独查询-02-01这一天是否签到,如果签到则总次数就减1

通过上面的例子,可以看到以bit为单位存储非常节省空间,用8个bit就可以表示8天内的签到情况。也可以用bitmap来存储所有用户一天内的签到情况,这种就以用户ID作为bit的偏移量,如果用户ID很大,超过了bitmap的最大范围,可以通过用户ID分片到不同的bitmap上

地理位置

在同一个key内添加多个位置(经纬度),计算位置各个位置之间的距离,也可指定圆心按半径查找符合条件的位置,可实现附近的xxx功能

命令

#向key1添加一个叫

1
查看完整版本: redis必会基础命令数据结构lua