02.Redis 的介绍以及相关数据类型
1.redis相关介绍
1.1 redis的介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
1.2 .redis和memcached的区别
redis和memcached相比本质是解耦,用大数据说法是计算向数据移动
1.3 . liunx下常见的redis命令
#连接redis
redis-cli
#连接redis是6379端口的8号库 指定库(不同库数据不可见)
redis-cli -p 6379 -n 8
#连接redis后使用help进行查询
help
2.redis相关数据的操作常见命令
在redis客户端中使用help命令进行相关查询相关命令
2.1 Strings类型
2.1.1 查看string类型帮助命令
help @string
2.1.2 string数据类型及相关的应用场景
- 字符串
#set设置key的value
set k1 ooxx nx (带nx,xx可用在分布式锁中)
set k1 ooxx xx
#mset批量设置
mset k3 k3mest k4 k4mest
#get获取key的value
get k1
#mget批量获取
mget k3 k4
#APPEND在字符串后面追加
append k1 " world"
#GETRANGE获取指定范围数据
getrange k1 5 10
#strlen获取字符串长度
strlen k1
- 数值
incr 将value的整数型+1
incrby 将value的整数型加指定数
decr
descby
应用场景 : 抢购,秒杀,详情页,点赞,评论规避并发下,对数据库的事务操作完全由redis内存操作代替,避免因数据库事务导致响应时间超时,但在银行等金融涉及金额不要放在redis中进行相关计算
-
bitmap
setbit //设置bit数值 bitcount bitpos bitop
应用场景 :
1. 统计用户登陆天数
方案:用户id为key,设计长度为9bit的数据即可存储用户当年所有登陆天数数据,当天登陆为1,即可统计指定时间段的相关数据
2. 统计当天所有用户登陆情况
方案:日期为Key,设计一个合适长度的数据存储,每一位对应一位客户,登陆则为1,统计时直接进行二进制与运算,则可以去重,统计那些用户登陆
2.2 Lists类型
2.2.1 Lists常见命令
#lpush 存放顺序为f e d c b a
lpush k1 a b c d e f
#rpush 存放顺序为a b c d e f
rpush k2 a b c d e f
#取数据 lpop
lpop k1
#lrange按照范围取
lrange k1 0 -1(取全部)
#lindex
#lset
2.2.2应用场景
- 使用lpush模拟栈,后进先出
- 使用rpush模拟队列,先进先出(买票排队问题)
- lindex模拟数组,直接根据下标取相关数据
- blpop模拟阻塞单播队列(blpop会让对应key有则弹出value,没有会阻塞等待key有值,并且只会弹出一次,当多个客户端同时对一个key使用blpop则可以实现阻塞单播)
2.3 hashes类型
类似java中的hashmap(key,hashmap(key,value))。这里面第一个key是hashes的key,hashmap(key,value)才是value
2.3.1 hashes常见命令
hdel
hget
hset
hlen
hincrbyfloat
2.3.2 应用场景:
- 对员工薪水进行统计
2.4 sets数据类型
Redis Set 是 String 的无序排列。SADD
指令把新的元素添加到 set 中。对 set 也可做一些其他的操作,比如测试一个给定的元素是否存在,对不同 set 取交集,并集或差,等等。
2.4.1常见命令
sadd //添加元素sadd myset 1 2 3smembers //读取集合元素smembers mysetsismember //判断元素存在sismember myset 3 //存在返回1,不存在为0 SINTER //获取多个集合的交集 SUNIONSTORE //多个集合取并集
2.4.2 应用场景
-
公平抽奖(随机事件) : SRANDMEMBER key count(用户作为value)
正数:取出一个去重的结果集(不能超过已有集)
负数:取出一个带重复的结果集,一定满足你要的数量如果:
0,不返回
2.5 sorted sets数据类型
2.5.1 常见命令
zaddzmenmberzinterzscore //按照什么排序
2.5.2 排序底层实现
通过Skip list(跳跃表)实现增删查改