REDIS基础数据类型与命令学习笔记

79 阅读8分钟

全局命令

    keys L* //查询所有的key。此命令会将所有的key全都查出来,在key多时,影响性能。
            生产上不建议使用。
    dbsize//查询中所有key的个数。不需要遍历所有键,而是直接获取 Redis内置的键总数。
    exists tkey//是否存在,存在1,不存在0
    expire tkey 10//设置过期时间,单位秒
    pexpire tkey 10//设置过期时间,单位毫秒
    expireat key 秒级时间截timestamp//timestamp时间戳后过期
    pexpireat key 毫秒级时间截timestamp//timestamp时间戳后过期
    ttl key// >=0:剩余过期时间;-1:永不过期;-2:已过期
    persist tkey//让key永不过期
    type tkey//返回value的类型
    randomkey//随机一个key返回对应value
    rename oldkey newkey//key重命名

注意

  • 对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视
  • Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,不能对二级数据结构做过期时间设置。
  • rename之前,新键已经存在,那么它的值也将被覆盖,也会将新建的过期时间重置为永不失效
  • timestamp 是1970年1月1号到现在的秒数与毫秒数。

String

set key value//ex:秒、px毫秒、nx存在就放弃,key不存在才执行、xx存在才执行,key不存在就放弃命令。
                返回值是影响的 行数 
setex key seconds value//为键设置秒级过期时间  返回ok(如果key存在,会覆盖之前的设置)
setnx key value//必须不存在,才可以设置成功 返回1或者0
get key//返回key对应的value值 ; 不存在则返回nil(空) ;不是字符串类型会报错
mset k1 v1 k2 v2 k3 v3...//批量设置键值对
mget k1 k2 k3...//批量获取键对应的值。
incr key//值不是整数,返回错误 ; 值是整数,返回自增后的结果 ; 键不存在,按照值为0自增,返回结果为1。
        Redis提供了decr(自减)、 incrby(自增指定步长)、decrby(自减指定步长)、incrbyfloat(自增浮点数)
append key string//key对应的值后面追加,字符串拼接
strlen key 字符串长度(一个中文占的长度是3)
getset key newvalue//设置新值,返回旧值(不存在则返回nil(空))
setrange key index str//将index位索引的值替换为str ; 返回新字符串长度 ; str可以是多字符的字符串
                        index越界不会报错,redis会主动为缺失的位补null,计算长度的时候也是会算上
getrange key startindex endindex//获取开始索引(包含此索引)、结束索引(包含此索引)字符串视图
缓存功能:Redis 作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。减少数据库压力
计数:使用Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。
共享Session
限速:很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。
但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。一些网
站限制一个IP地址不能在一秒钟之内方问超过n次也可以采用类似的思路。

批量操作命令可以有效提高效率,假如没有mget这样的命令,要执行n次get命令具体耗时如下:

n次 get时间=n次网络时间+n次命令时间

使用mget命令后,要执行n次get命令操作具体耗时如下:

n次get时间=1次网络时间+n次命令时间

巧记

  1. m 含义是mutiple 多个,批量的意思
  2. ex 秒、px时间
  3. nx key不存在才生效
  4. xx key存在才生效

Hash

约定习惯

  • key:最外层的key
  • map:key对应的value整体结构
  • field:map里面的key
  • value:map

命令

hset key field value//返回值是影响的field条数; 设置某一字段具体值;也是能多条field
hget key field//返回具体field对应的值;key或field不存在会返回nil;不能多个field 不然会报错
hdel key field//返回结果为成功删除field的个数; 会删除一个或多个field
hlen key//计算field个数
hstrlen key field//返回field对应value的长度;只能一个field,不支持多个field
hmset key f1 v1 f2 v2...//返回ok;批量设置field-value 键值对
hmget key f1 f2...//批量返回field对应的value
hexists key field//判断field是否存在;1-存在、0-不存在
hkeys key//返回所有的 field
hvals key//返回所有的 value
hincrby key field//返回自增后的值;值是整数,返回自增后的结果 ; 键不存在,按照值为0自增,返回结果为1。
                   hincrbyfloat同理

巧记

  • h可以理解为hash,我更愿意理解为对field操作。

List

前置知识

  • list本质是一个双向链表。命令前 l与r决定连表方向,决定左边|右边 谁是链表头
  • list存储是有序的
  • list是可以存储重复值的
lrange key startindex endindex//返回指定索引闭区间的元素 视图 ;
                                startindex从0开始;endindex-1代表最后、-2代表倒数第二个
                                endindex索引越界会查询到最后一个为止
lpush key value//向链表左侧添加元素 rpush是向右侧添加元素
LINSERT key BEFORE|AFTER old new//在某个元素前或后插入新元素;
                                正常返回新list的长度
                                若old不存在,返回-1
                                若key不存在返回0
lpop key //从列表左侧弹出,会删除弹出的元素
lrem key count value//从左或者右删除 最多 count 个 value对象;返回成功删除元素的个数
                    count>0:从头往尾数
                    count<0:从尾往头数
                    count=0:删除全部
ltirm key startindex endindex//返回OK;截取保留指定索引区间的值(闭区间);
                             startindex从0开始,endindex-1(-号代表从表尾数)代表最后元素
                             endindex 越界是到表尾
lset key index value//修改指定索引下标的元素;返回ok
lindex key index// 获取列表指定索引下标的元素值;index从0开始,越界返回null
llen key//获取列表长度
blpop key [time s]//可以理解为lpop的阻塞版,没有数据,就阻塞(不对客户端返回)指定秒数;0表示一直等待

数据结构

  • lpush+lpop =Stack(栈)

  • lpush +rpop =Queue(队列)

  • lpush+ ltrim =Capped Collection(有限集合)

  • lpush+brpop=Message Queue(消息队列)

Set

sadd key val1 val2...//返回结果为添加成功的元素个数;允许添加多个(字符串元素)
srem key v1 v2...//返回结果为成功删除元素个数;允许添加多个
scard key//返回集合大小
sismember key val//判断val是否在集合中;1-存在、0-不存在
srandmember key num//随机返回指定num个元素视图;不写就是1
spop key num//返回弹出的元素;随机弹出指定num个元素;不写就是1
smembers key//返回集合中所有成员变量;
sinter set1 set2//返回set1 、set2交集视图
sinterstore mudikey s1 s2//返回mudikey集合长度;将s1、s2合集存到mudikey集合里
suinon set1 set2//返回set1 、set2并集视图
suinonstore mudikey s1 s2//返回mudikey集合长度;将s1、s2并集存到mudikey集合里
sdiff set1 set2//返回set1中set2中没有的元素(差集)
sdiffstore mudikey set1 set2//返回mudikey集合长度;将s1、s2c差集存到mudikey集合里

Zset

zadd key [nx|xx] [ch] [incr] score1 v1 score2 v2...//结果代表成功添加成员的个数
                                      nx: member必须不存在,才可以设置成功,用于添加.
                                      xx: member必须存在,才可以设置成功,用于更新
                                      ch: 返回此次操作后,有序集合元素和分数发生变化的个数
                                      incr: 对score做增加,相当于后面介绍的zincrby
ZCARD key//Sorted Set 中有多少个元素
ZCOUNT key min max//查看指定 score 范围内的元素个数;查询区间[min,max]
zrank key v//查询的是排名索引值,从0开始;根据score从小到大的排序;key 或者 v不存在都返回nil
zrevrank key v//查询的是排名索引值,从0开始;根据score从大到小的排序
ZINCRBY key score value//增加指定元素的 score 值;返回新增后的分值
--------------------------下面-----------------弹出命令--------------------------------------
ZPOPMAX key [count]//按照 score 值从高到低弹出count个数元素;默认1个;返回value 与 score
ZPOPMIN key [count]//按照 score 值从低到高弹出count个数元素;默认1个; 返回value 与 score
BZPOPMAX key... timeout//ZPOPMAX阻塞版本;timeout秒,默认永不超时;返回 key value score
                       //在第一个 Sorted Set 集合为空时,才会弹出第二个 Sorted Set 集合中的元素。
BZPOPMIN key... timeout//同上
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
                        //REV 分值从高到低--> start stop 要与 REV保持一致
                        //LIMIT offset count 从offset开始最多查count条数据
                        //start stop 可以用[val 或者(val 表示
                        //返回val的同时返回分数