概括
- Redis 是完全开源免费的,遵守BSD 协议,是一个灵活的高性能key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。 Redis 比其他key-value 缓存产品有以下三个特点: Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存使用。
- redis 命令
基于epoll 实现io交互
redis 基础操作
set k1 v nx
- nx代表了当key 不存在的时候才能set 成功否则返回nil
- 业务场景为分布式锁
set k2 v xx
- 只能进行update操作,当key 不存在则返回nil
mset k3 a k4 b
mget k3 k4
GETSET k5 啦啦啦
- 设置新value 并返回原来的值
- 可以节约通信请求的次数
- 可以保证原子性,在并发set 的时候可以保证其顺序进行,不过被中间插入。
redis 基础知识
- redis 的key 都是string
- redis里所有的value存的都是二进制(原因是统一编码规范,多个客户端需要统一其解码方式)
redis 对于位的操作 bitmap
setbit key6 1 1 #把key6 设置第一个位的值为1
redis 的 value
List
lpush key ll a b c d e f g # 推送多个key 到redis中顺序如下图他是按照顺序推的
lpop key # 弹出最左边的元素
lrange key 0 -1 #查询list 指定范围内的信息
lindex key 2 # 查询下标为2的元素
lset key 3 x #设置下标为3的元素为x
lrem key 2 a # 从左边开始删除2个a
linsert key after a b # 在a 后面插入一个b before同理
Hash
hmset hashmap field1 value1 field2 value2 #设置多个key 到hashmap 这个key中
hmget hashmap field1 field2 # 获取hash中的多个key
HINCRBYFLOAT hashmap kk 0.5 # 支持计算 给map 中的某个key + 1
Set
- 类似java HashSet
- 他是不可重复的
- 他是无序的
sadd key1 a b c d e # 把abcde加到key中
sinter key1 key2 # 获取key1 和 key2 的交集
sinterstore res key1 key2 # 获取key1 和 key2 的交集 并保存到res 集合中
sunion key1 key2 # 获取并集,当然因为是一个set 所以他是会去重的
sdiff key1 key2 # 获取 key1中存在 key2中不存在的元素
srandmember key1 2 # # 获取2个随机参数
- srandmember 参数如果为正数 会尽可能多的数量的随机数 但是不会产生重复,如总共元素为7个,参数为10个,则只会返回7个,如果为负数则有可能会返回重复值,必然能达到参数的数量值,业务场景为抽奖
spop key1 # 随机弹出一个元素
- 由于是无序的 等同于每次随机弹出1个元素出来 同样可以实现抽奖 并且奖品还会减少
SortedSet
- 带排序功能的set
- 每次追加元素的时候需要手动设置序值,如果序值相同会按照元素倒序
- 检索时候可以按照序值范围检索数据
zadd abc 1 a 2 b 3 c # 追加元素第一个为a 第二个为b 第三个为c
zrange abc 0 -1 # 获取排序的元素
zrevrange abc 0 -1 #倒序排序
SortedSet排序是怎么实现的,crud 的速度怎么样?
- SortedSet 底层是跳表
- 他也是链表 他有两层链表,先从大范围上跳跃再从小范围跳跃。
- 修改操作其实是删除了再新增
redis 事务
- 与mysql 不同redis 的事务不支持回滚,redis 的事务只保证事务在执行中中间无法被插入执行