学习Redis


文章目录

  • 前言
  • 一、redis入门
  • 二、10大数据类型
    • 1.字符串String
    • 2.列表list
    • 3.哈希表Hash
    • 4.集合set
    • 5.有序集合zset(sorted set)
    • 6.位图bitmap
    • 7.基数统计HyperLogLog
    • 8.地理空间geo
    • 9.流Stream
    • 10.位域bitfield
  • 总结


前言

Redis(远程字典服务器),NoSQL数据库

一、redis入门

1.redis与MySQL关系
1】redis是key-value键值对数据库,NoSQL一种,而MySQL是关系数据库
2】redis数据操作主要在内存,MySQL主要存储在磁盘
3】redis在某些使用场景中明显优于MySQL,如计算器、排行榜等
4】redis通常用于一些特定场景,需要与MySQL配合使用,两者不是相互替换和竞争关系,而是共用和配合使用
2.redis优势
1】性能极高,读写速度快
2】redis数据类型丰富,不仅支持key-value类型的数据,同时提供list,set,zset,hash等数据结构的存储
3】redis支持数据的持久化,将内存中的数据保存在磁盘中,重启时可再次加载使用
4】redis支持数据备份,即master-slave模式的数据备份
3.redis应用场景
缓存加速,分布式会话,排行榜场景,分布式计数器,分布式锁

二、10大数据类型

1.字符串String

1】常用命令
set key value;get key
同时设置/获取多个键值 mset key value;mget key value;msetnx key value
获取指定区间范围内的值 getrange/setrange
数值增减,递增数字 incr key;增加指定的整数 incrby key increment;递减数值 decr key;减少指定的整数 decrby key decrement
获取字符串长度和内容追加 strlen key;append key value
分布式锁 setnx key value;setex(set with expire)键秒值/setnx(set if not exist)
getset(先get再set)

2.列表list

一个双端链表结构(两端操作性能高,通过索引下标的操作中间的节点性能会较差),容量是2的32次方减1个元素,主要功能是push/pop等,一般用于栈、队列、消息队列等场景。
left,right都可插入添加,若键不存在,创建新的链表,若键存在,新增内容,若值全移除,对应的键消失
1】常用命令
lpush/rpush/遍历lrange
lpop/rpop 出栈
lindex 按照索引下标获取元素(从上往下)
llen 获取列表中元素的个数
lrem key 数字N 给定值v1(删除n个值等于v1的元素)
ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush 源列表 目标列表
lset key index value
linsert key before/after ,已有值,插入新值
2】使用场景,微信公众号订阅的消息

3.哈希表Hash

KV模式不变,但value是一个键值对
1】常用命令
hset/hget/hmset/hmget/hgetall/hdel
hlen 获取某个key内的全部数量
hexists key 在key里面的某个值的key
hkeys/hvals 获取key/value值
hincrby/hincrbyfloat int/float递增特定数值
hsetnx 不存在新增,存在无操作
2】使用场景 早期购物车

4.集合set

单值多value,无重复元素
1】常用命令
sadd key member[member…] 添加元素
smembers key 遍历集合中的所有元素
sismember key member 判断元素是否在集合中
srem key member[member…] 删除元素
scard 获取集合里面的元素个数
srandmember key [数字] 从集合中随机展现设置的数字个数元素,元素不删除
spop key [数字] 从集合中随机弹出一个元素,出一个删一个
smove key1 key2 在key1里已存在的某个值 将key1里已存在的某个值赋给key2
集合运算
集合的差集运算A-B 属于A但不属于B的元素构成的集合 sdiff key[key…]
集合的并集运算AUB 属于A或者属于B的元素合并后的集合 sunion key[key…]
集合的交集运算A B 属于A同时也属于B的共同拥有的元素构成的集合 sinter key[key…]
sintercard numkeys key[key…][LIMIT limit] 它不返回结果集,而只返回结果的基数,返回由所有给定集合的交集产生的集合的基数
2】使用场景
微信抽奖小程序
微信朋友圈点赞查看同赞朋友
QQ内推可能认识的人

5.有序集合zset(sorted set)

与set集合区别,每个value值前加一个score分数值
1】常用命令
向有序集合中加入一个元素和该元素的分数
zadd key score member[score member…] 添加元素
zrange key start stop[withscores] 按照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素
zrevrange 与上一个命令获取的元素,倒序排列
zrangebyscore key min max [withscores] [limit offset count] 获取指定分数范围的元素《(指不包含,limit 返回限制》
zscore key member 获取元素的分数
zcard key 获取集合中元素的数量
zrem key 某score下对应的value值 删除元素
zincrby key increment member 添加某个元素的分数
zcount key min max 获取指定分数范围内的元素个数
zmpop 从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对
zrank key values值 获得下标值
zrevrank key values值 逆序获得下标值
2】使用场景
根据商品销售对商品进行排序显示

6.位图bitmap

由0和1状态表现的二进制位的bit数组
位图本质是数组,基于String数据类型的按位的操作,用于状态统计
1】常用命令
setbit key offset value offset指偏移位,从0开始算的 value值只能0或1
getbit
strlen 统计字节数占用多少
bitcount 全部键里面含有1的有多少个
bitop
2】使用场景
一年365天,全年天天登录占用多少字节
按照年

7.基数统计HyperLogLog

去重复统计功能的基数估计算法就是HyperLogLog
基数是一种数据集,去重复后的真实数据
基数统计,用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算,即去重脱水后的真实数据
1】需求
统计某个网站UV,某篇文章UV(UV指Unique Visitor独立访客,一般理解为客户端IP,需要去重考虑)
用户搜索网站关键词的数量
统计用户每天搜索不同词条个数
2】常用命令
pfadd key element[element…] 添加元素
pfcount key[key…] 返回给定HyperLogLog的基数估算值
pfmerge destkey sourcekey[sourcekey…] 将多个HyperLogLog合并为一个HyperLogLog

8.地理空间geo

存储地理位置信息
1】常用命令
geoadd 经度 纬度 地名
中文乱码如何处理 添加–raw
geoppos key 地名 返回经纬度
geohash key 地名 返回坐标的geohash表示 geohash算法生成的base32编码值 3维变2维变1维
geodist key 地名1 地名2 距离单位(m,km) 两个位置之间的距离
georadius 以半径为中心,查找附近的xxx
georadiusbymember 以半径为中心,查找附近的xxx

9.流Stream

实现消息队列,它支持消息的持久化,支持自动生成全局唯一ID,支持ack确认消息模式,支持消费组模式等,让消息队列更加的稳定和可靠
底层结构 Stream结构
1】队列相关指令
xadd 添加消息到队列末尾 消息ID必须比上个ID大,* 用于xadd命令中,让系统自动生成ID
xtrim 对Stream的长度进行截取,如果已经超长会进行截取 maxlen 允许的最大长度,对流进行修剪限制长度; minid 允许的最小id,从某个id值开始比该值小的将会被抛弃
xdel 删除消息
xlen 获取Stream的消息长度
xrange 获取消息列表,可以指定范围 start表示开始值,end表示结束值,-代表最小值,+代表最大值,count表示最多获取多少个值
xrevrange 和xrange相比区别在于反向获取,ID从大到小
xread 获取消息(阻塞/非阻塞),返回大于指定ID的消息
2】消费组相关命令
xgroup create 用于创建消费组
$表示从Stream尾部开始消费,0表示从Stream头部开始消费
xreadgroup group ">"表示从第一条尚未被消费的消息开始读取;消费组groupA内的消费者consumer1从mystream消息队列中读取所有消息,同一组的不同消费者不能读取同一条消息,但是,不同消费组的消费者可以消费同一条消息
xpending 查询没和消费组内所有消费者[已读取、但尚未确认]的消息,查看某个消费者具体读取了哪些数据
xack 向消息队列确认消息处理已完成
xinfo 用于打印消息队列

10.位域bitfield

位域修改,溢出控制
将一个redis字符串看作一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
1】常用命令
bitfield key[get type offset]
bitfield key[set type offset value]
bitfield key[incrby type offset increment] 默认情况下,incrby使用wrap参数
溢出控制overflow[wrap|sat|fail]
wrap:使用回绕(wrap around)方法处理有符号整数和无符号整数的溢出情况
sat:使用饱和计算(saturation arithmetic)方法处理溢出,下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值
fall:命令将拒绝执行那些会导致上溢或下溢情况出现的计算,并向用户返回空值表示计算未被执行

总结

例如

你可能感兴趣的:(redis,学习,数据库)