Redis-学习笔记
文章目录
1. 常用命令
本部分包括Redis常用操作命令。
1.1 基本操作
本部分包括Redis中对key的全局常用命令。
# 查找所有匹配给定模式的键
> keys pattern
(e.g. > keys *)
# 查看某key是否存在
> EXISTS key [key...]
# 获取key的有效时间(单位:秒)
> TTL key
# 获取key的有效时间(单位:毫秒)
> PTTL key
# 获取key的存储类型
> TYPE key
1.2 五大数据类型
本部分包括Redis的五大常见数据类型的常用操作命令。
1.2.1 String
本部分包括Redis-String的部分常用操作命令。
# 设置k-v
> SET key value
# 设置k-v,同时给定销毁时间【set with expire time】
> SETEX key seconds value
# 先判断是否已存在,再决定是否设置k-v【set if not exists,常用于分布式锁】
> SETNX key value
# 同时设置多个k-v
> MSET key1 value1 key2 value2 …
# 通过SETNX同时设置多个k-v【为原子操作】
> MSETNX key1 value1 key2 value2 …
# 设置对象 object:{id}:{field}
> MSET user:id:1 user:name:zzay
# 获取value
> GET key
# 同时获取多个key
> MGET key1 key2 key3 …
# 追加字符串
> APPEND key value
# 获取字符串长度
> STRLEN key
# 执行原子加1操作
> INCR key
> DECR key
# 执行原子加给定值操作
> INCRBY key increment
> DECRBY key decrement
# 执行原子加给定浮点数操作
> INCRBYFLOAT key increment
> DECRBYFLOAT key decrement
# 获取字符串某范围的子串【包含start和end处元素】
> GETRANGE key start end
> GETRANGE key 0 -1:获取全部字符串,等同于get
# 替换字符串给定范围内的内容【给定初始位置,根据value长度进行覆盖替换】
> SETRANGE key offset value
> SETRANGE key(‘abcd’) 1 xx —> res:’axxd’
# 先获取,再设置k-v【最终值一定改变。若本不存在返回nil,反之返回原本值】
> GETSET key value
1.2.2 List
本部分包括Redis-List部分常用操作命令。
# 获取队列长度
> LLEN key
# 在队列头部添加元素
> LPUSH key value
# 在队列尾部添加元素
> RPUSH key value
# 删除队列第一个元素
> LPOP key
# 删除队列最后一个元素
> RPOP key
# 删除一定个数的具有指定值的key【count:移除个数】
> LREM key count value
# 更新队列中给定下标处的元素值【若该下标处元素不存在/下标不存在,不会自动添加 而会报错】
> LSET key index value
# 截取队列中给定范围区间的元素,并取代原list【包含start和stop处元素】
> LTRIM key start stop
# 通过给定下标获取队列某元素【index从0开始】
> LINDEX key index
# 通过给定区间范围获取队列元素【包含start和end处元素】
> LRANGE key start end
> LRANGE key 0 -1: 获取列表所有元素
# 移除某队列a的最后一个元素,并将其添加到另一队列b的头部
> RPOPLPUSH key newList
# 将给定值插入到队列中参考元素的前面/后面
> LINSERT key BEFORE/AFTER pivot value
> LINSERT key BEFORE “world” “new” —> “Hello” “new” “world”
1.2.3 Set
本部分包括Redis-Set部分常用操作命令。
- 特点:无序不可重复序列。
- 应用场景:共同关注、粉丝…
# 向集合中添加元素
> SADD key member
# 移除集合中某元素
> SREM key member
# 随即删除集合中的一个元素
> SPOP key
# 将某集合中的指定元素移动到另一集合中
> SMOVE key1 key2 member
# 获取集合元素个数
> SCARD key
# 获取集合所有元素
> SMEMBERS key
# 判断给定元素是否存在于集合当中
> SISMEMBER key member
# 随机抽选集合中n个元素【n=1可省略】
> SRANDMEMBER key n
# 求两集合的交集/并集/差集
> SINTER/SUNION/SDIFF key1 key2
1.2.4 Hash
本部分包括Redis-hash部分常用操作命令。
- 特点:本质可理解为Map集合,key-map形式。
- 应用场景:经常变更的信息,如用户信息。更适合用于对象的存储。
# 向hash表中添加单个元素
> HSET key field value
# 向hash表中同时添加多个元素
> HMSET key field1 value1 [field2 value2 …]
# 获取hash表中某字段值,返回value
> HGET key field
# 获取hash表中多个字段值,返回value
> HMGET key field [field2 …]
# 获取hash表中所有元素,按k、v的顺序列出
> HGETALL key
# 删除hash表中某字段,包括key和value
> HDEL key field
# 获取hash表的元素个数
> HLEN key
# 判断hash表中某字段是否存在
> HEXISTS key field
# 获取hash表中所有key
> HKEYS key
# 获取hash表中所有value
> HVALS key
# 其他操作同上
> HSETNX / HINCRBY / HDECRBY
1.2.5 ZSet
本部分包括Redis-ZSet部分常用操作命令。
- 特点:有序集合。
- 应用场景:消息权重;排行榜;工资表/成绩排序。
# 向集合中添加值
> ZADD key score member [score member ...]
# 移除集合中元素
> ZREM key member [member ...]
# 获取集合元素个数
> ZCARD key
# 获取指定区间内成员数量
> ZCOUNT key min max
# 获取集合中某范围内元素
> ZRANGE key min max
# 从低到高获取集合中某范围内元素【min < max,否则报错;常用-inf +inf】
> ZRANGEBYSCORE key min max [WITHSCORES]
# 从高到低获取集合中某范围内元素【min < max,否则报错;常用-inf +inf】
> ZREVRANGEBYSCORE key max min [WITHSCORES]
# 根据给定索引范围,从低到高返回某范围内元素
> ZRANGE key start stop [WITHSCORES]
# 根据给定索引范围,从高到低返回某范围内元素
> ZREVRANGE key start stop [WITHSCORES]
1.3 三大特殊类型
本部分包括Redis的三大特殊类型的常用操作命令。
1.3.1 Geospatial
本部分包括Redis-Geospatial部分常用操作命令。
- 底层实现:ZSet,因此可以使用ZSet相关命令进行操作。
# 添加地理位置【两极无法直接添加,通常通过java直接导入】
> GEOADD key longitude latitude member
# 获取指定地理位置的经度和纬度
> GEOPOS key [key...]
# 获取两个给定地理位置之间的距离
> GEODIST key1 key2 [m|km|ft|mi]
# 以给定经纬度为中心,找出位于某一半径形成圆内的元素
> GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [COUNT n]
# 以给定地理位置为中心,找出位于某一半径形成圆内的元素
> GEORADIUSBYMEMBER key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [COUNT n]
# 返回一个或多个位置元素的Hash值,将二维的经纬度转化为一维的字符串
> GEOHASH key member [member...]
1.3.2 HyperLogLog
本部分包括Redis-HyperLogLog部分常用操作命令。
- 优点:占用内存固定,2^64不同元素的基数,只需要12KB的内存。
- 应用场景:网页的UV(Unique Visitor)。传统方式为用Set存储用户id,之后通过统计Set的元素数量来作为标准判断,因此有大量冗余数据。若允许容错,此时可以用HLL,其错误率为0.81%。
# 添加元素
> PFADD key element [element ...]
# 获得集合基数数量
> PFCOUNT key [key ...]
# 求多个集合并集
> PFMERGE destkey sourcekey [sourcekey ...]
1.3.3 Bitmaps
本部分包括Redis-Bitmaps部分常用操作命令。
- 特点:通过操作二进制位进行记录,只有0和1两种状态,节约内存。
- 应用场景:统计具有两种状态的信息,如活跃状态、登录状态、打卡状态等。
# 设置位图中指定位置处的bit值,0或1
> SETBIT key offset 0|1
# 获取位图中指定位置处的bit值
> GETBIT key offset
# 统计bit为1的元素个数
> BITCOUNT key
2. 重点概念
本部分包括Redis部分重要概念笔记。
2.1 事务
本部分包括Redis中事务相关概念以及操作介绍。
2.1.1 定义及特点
Redis事务本质:一组命令的集合。一个事务中的所有命令都会被序列化,并且在事务执行过程中会按照顺序执行,具有一次性、顺序性、排他性。
- Redis的单条指令是保证原子性的,但是Redis事务不保证原子性。
- Redis事务没有隔离级别的概念。
- 命令在Redis事务中没有直接被执行,而只有在发起执行命令EXEC时才会执行。
2.1.2 操作命令
- 开启事务(MULTI)
- 命令入队
- 执行事务(EXEC)
- 取消事务(DISCARD)
2.1.3 异常
- 编译型异常:代码/命令存在问题,结果导致事务所有命令都不会被执行。(e.g. 参数缺失)。
- 运行时异常:若事务队列中存在语法性,则执行命令时其他命令可以正常执行,错误命令抛出异常。(e.g. 对字符串进行自增操作)。
2.1.4 乐观锁
- 悲观锁:认为任何时候都可能出现问题,无论做什么都加锁。
- 乐观锁:认为任何时候都不会出现问题,不上锁。更新数据时通过获取version进行比较,判断在此期间数据是否被修改过。
Redis中的乐观锁通过watch和unwatch关键字实现。其中watch的实质相当于数据库中获取当前version操作。unwatch在进行multi-exec后会自动调用,通常无需手动调用。
以下为Redis乐观锁的例子。
# Thread 1:
> SET money 100
> WATCH money # 监视money对象
OK
> MULTI
OK
> INCRBY money 50
QUEUED
# Thread 2:
> SET money 1000
# Thread 1:
> EXEC # 事务执行前,其他线程对相关数据进行修改,导致事务执行失败。
(nil)
进行比较,判断在此期间数据是否被修改过。