Redis-学习笔记

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)
进行比较,判断在此期间数据是否被修改过。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值