redis学习02

redis十大数据类型

redis键(key)的操作

1.keys *

查看当前库所有的key

2.exist key

查看key是否存在

3.type key

查看key 是什么类型

4. del key

删除指定的key数据

5. unlink key

非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
del key 是原子的删除,只有删除成功了才会返回删除结果,如果是删除大key用del会将后面的操作都阻塞,而unlink key 不会阻塞,它会在后台异步删除数据。

6. ttl key

查看当前还有多少秒过期

7. expire key

为给定的key设置过期时间

8. move key dbindex[0-15]

将当前数据库的key移动到给定的数据库DB当中

9. select dbindex

切换数据库[0-15],默认为0

10. dbsize

查看当前数据库key的数量

11. flushdb

清空当前数据库

12. flushall

通杀数据库!!危险

1. String

  1. string是redis最基本的数据类型,一个key对应一个value。
  2. string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象
  3. string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M

常用操作
在这里插入图片描述
在这里插入图片描述
最常用:
set key value
在这里插入图片描述
get key
keepttl:
保持ttl
同时设置/获取多个值
MSET key value[key value]
MGET key [key]
mst/mget/msentx:
mset:同时设置一个或多个 key-value 对。
在这里插入图片描述

mget:获取所有(一个或多个)给定 key 的值。
在这里插入图片描述
msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
在这里插入图片描述
获取指定范围内的值
getrange:获取指定区间范围内的值,类似between…and的关系
从零到负一表示全部
在这里插入图片描述
setrange设置指定区间范围内的值,格式是setrange key值 具体值
在这里插入图片描述
数值增减:
1. 一定要是数字才能进行加减
2. 递增数字:INCR key
3. 增加指定的整数:INCRBY key increment
4. 递减数值:DECR key
5. 减少指定整数:DECRBY key decrement

获取字符串长度和内容追加
STRLEN key
APPEND key value
分布式锁
在这里插入图片描述
getset(先get再set)
getset:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
简单一句话,先get然后立即set
在这里插入图片描述

2. List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素(4294967295,每个列表超过40亿个元素)
常用命令
在这里插入图片描述在这里插入图片描述
单值对应多value
一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。
left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
在这里插入图片描述

3. Hash

Redis hash 是一个 string 类型的 field (字段) 和 value(值) 的映射表hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
常用指令
在这里插入图片描述
KV模式不变,只是V变成了一个键值对

4. Set

Redis 的 Set 是 string 类型的无序集合hashtable.
集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者
Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1(429497295,每个集合可存储40多亿个成员)
常用指令
在这里插入图片描述
单值多value,无重复

5. ZSet

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1
补充:在set基础上,每个val值前加一个score分数值,之前set是k1,v1,v2,v3
现在zset是k1,score v1,score v2, socre v3
**常用指令 **
在这里插入图片描述
在这里插入图片描述

6. 地理空间(GEO)

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括
添加地理位置的坐标。
获取地理位置的坐标。
计算两个位置之间的距离。
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
简介
移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,
然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
使用如下SQL即可:

select taxi from position where x0-r < x < x0 + r and y0-r < y < y0+r

但是这样会有什么问题呢?
1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的
2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。
3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差.
GEO原理
核心思想就是将球体转换为平面,区块转换为一点
在这里插入图片描述
在这里插入图片描述
Redis在3.2版本后增加了地理位置的处理
命令
GEOADD 多个经度(longitude),纬度(latitude)、位置名称(member)添加到指定的key中
GEOPOS从键里返回所有给定位置元素的位置,(经度和纬度)
GEODIST返回两个给定位置之间的距离
GEORADIUS:
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
COUNT 限定返回的记录数。
在这里插入图片描述
GEORADIUSBYMEMBER:
在这里插入图片描述
在这里插入图片描述

7. 基数统计(HyperLogLog)

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 264 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLocLo 不能像集合那样,返回输入的各个元素
需求:统计某个网站的UV,统计某个文章的UV
UV:Unique Vistor,独立访客,一般理解为客户端ip
用户搜索网站的关键词,统计用户每天搜索不同词条个数
去重统计功能的基数估计算法就是(HyperLogLog)
基数:是一种数据集,去重复后的真是个数,
基数统计:用于统计一个集合中不同元素的个数,就是对集合去重复后剩余元素的计算。

8. 位图(bitmap)

由0和1状态表现的二进制位的bit数组
需求:
用户是否登陆过?
电影,广告是否被点击播放过?
钉钉打卡上下班?
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
Bitmap支持的最大位数是232位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(232 = 4294967296)
在这里插入图片描述

通常用于状态统计
基本命令
setbit:
setbit key offset value(setbit 键 偏位移 只能是零或一)
在这里插入图片描述
Bitmap的偏移量是从零开始算的
getbit:get key offset
strlen:统计字节数占多少?
bitcount全部键里含有1的有多少个
bitop
连续2天都签到的用户
加入某个网站或者系统,它的用户有1000W,做个用户id和位置的映射
比如0号位对应用户id:uid-092iok-lkj
比如1号位对应用户id:uid-7388c-xxx
在这里插入图片描述

9.位域(bitfiled)

通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数织,这个数纲中的元
素对应参数列表中的相应操作的执行结果。
说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
将一个Redis字符串看作是一个由二进制组成的数组并且对变长位宽和任意没有字节对齐的指定整形位域进行寻址和修改。
在这里插入图片描述
不是很懂,个人理解,用Java作类比,位图就是可以直接修改字节码,省去编译的一步。

10.流(Stream)

Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有人Redis stream 主要用于消息队列 (MO,Message Queue)缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅(pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失
实现消息队列,他支持消息的持久化,支持自动生成全局唯一ID,支持ack确认消息的模式,支持消息组模式等,让消息队列更加的稳定和可靠。
底层结构和原理说明
在这里插入图片描述
一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容

1Message Content消息内容
2Consumer group消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者
3Last_delivered_id游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
4Consumer消费者,消费组中的消费者
5Pending_ids消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理

队列相关指令
在这里插入图片描述
消费组相关指令
在这里插入图片描述
四个特殊符号
- + :最小和最大可能出现的id
$: $表示只消费的消息,当前流中最大的id,可用于将要来的信息。
> : 用于XREADGOUP命令,表示迄今为止还没有发送给组中使用者的信息,会更新消费者组最后的id
*: 用于XADD命令中,让系统自动生成。
就是Redis版的消息队列+阻塞队列,个人认为,不如使用专门的消息队列。

Redis学习汇总已完结,包括以下几个主题的学习和理解:入门、基础、整合、进阶和拓展。入门部分包括五大数据类型的学习和理解。基础部分包括三大特殊数据类型的学习和理解,以及Redis中事务和乐观锁的实现。整合部分包括在Jedis中如何使用和操作Redis,以及SpringBoot如何整合Redis。进阶部分包括Redis的配置文件详解,持久化之RDB和AOF,如何实现发布订阅功能,以及如何配置主从复制模式和哨兵模式。拓展部分包括Redis缓存穿透、击穿和雪崩的理解和学习,以及Redis的面试题整理和解答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习汇总(已完结)](https://blog.csdn.net/weixin_43829443/article/details/112839985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [redis学习汇总](https://blog.csdn.net/zhengxiangling_02/article/details/106877123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值