【学习笔记】Redis学习笔记 持续更新-0728
Redis简介
什么是Redis?
redis是一个开源的基于内存的数据存储系统
使用场景
作为数据库、缓存和消息中间件
数据类型
五种基本数据类型
简介
类型
特性
场景
字符串 String
二进制安全
可以包含任何数据,比如 JPG 图片或者序列化的对象,一个键最大能存储 512M
简短的字符场景
哈希 Hash
键值对集合,即编程语言中的 Map 类型
适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值
存储、读取、修改用户属性
列表 List
链表(双向链表)
增删快,提供了操作某一段元素的 API
①最新消息排行等功能(比如朋友圈的时间线); ②消息队列
集合Set
哈希表实现,元素不重复
①添加、删除,查找的复杂度都是 O(1) ②为集合提供了求交集、并集、差集等操作
①共同好友; ②利用唯一性,统计访问网站的所有独立 IP; ③好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐
有序集合 Sorted Set
将 Set 中的元素增加一个权重参数 score,元素按 score 有序排列
数据插入集合时,已经进行天然排序
①排行榜; ②带权重的消息队列
五种高级数据类型
HyperLogLog
海量数据基数统计的场景,比如百万级网页 UV 计数等
消息队列 Stream
相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据
地理空间 Geospatial
存储地理位置信息的场景,比如滴滴叫车
位图 Bitmap
二值状态统计的场景,比如签到、判断用户登陆状态、连续签到用户总数等
位域 Bitfield
将一个 Redis 字符串看作是一个由二进制位组成的数组, 并对这个数组中任意偏移进行访问
操作方式
-
CLI (Command Line Interface)
通过Redis-CLI命令行工具来使用Redis -
API (Application Programming g Interface)
通过编写代码调用api来使用Redis -
GUI((Graphical User Interface)
使用图形化工具来使用Redis
Redis的优势
-
性能非常高,因为数据存在内存中,所以数据获取快;
-
支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等;
-
支持事务,且操作遵守原子性,即对数据的操作要么都执行,要么都不支持;
-
还拥有其他丰富的功能,队列、主从复制、集群、数据持久化等功能。
如何安装Redis
linux
sudo apt update sudo apt install redis-server
sudo service redis-server start
redis-cli
MacOS
brew install redis
brew services start redis
redis-cli
Windows
三种方式:
-
WSL安装linux,在linux里安装Redis
-
安装Docker,通过Docker运行Redis镜像
主要写通过安装文件来操作
-
通过安装文件安装
-
下载Redis: 访问Redis官网 redis.io/download,下载Windows版本的Redis,github地址Releases · tporadowski/redis (github.com)
-
安装Redis: 解压下载的压缩包到指定的目录。
-
启动Redis: 打开命令提示符(cmd),切换到Redis解压目录,运行以下命令启动Redis服务:
redis-server.exe redis.windows.conf
redis-cli.exe


用set和get操作redis
用set和get操作redis
set k2 v2 get k2


RedisInsight
下载路径:RedisInsight - The Best Redis GUI
随便输入邮箱和信息来下载
快捷管理


刚创建的key可以看到了

下方可以快捷打开命令行,无需在cmd里操作


开始使用Redis
Redis命令
SET(设置数据)
set key value:设置值
Redis中的数据是由键值对存取的,所以需要指定一个键和一个值,键和值之间使用空格来分隔,使用SET命令
SET name TingFeng
GET(获取数据)
get key:获取已经设置的值,如有,则返回,如没有,则会nil
GET name


tip:Redis的键是区分大小写的 TingFeng ≠tingfeng
DEL(删除值)
del key:删除值
使用DEL命令,删除之后再获取就提示(nil)
DEL name


EXISTS(判断)
EXISTS key:判断该值是否存在,如存在,返回1,不存在返回0
使用EXISTS命令
EXISTS name
name被删了所以不存在(0),k2之前被创建过,所以存在(1)


KEYS(查找数据库)
KEYS pattern:查找数据库里都有哪些键,pattern是一个 glob 风格的模式,用于指定要查找的键的模式
*:匹配任意数量的字符。
?:匹配单个字符。
[]:匹配在方括号内的任意一个字符(例如 [a-z] 匹配任意一个小写字母)。
\:用于转义特殊字符。
比如KEYS * 查找所有的键
KEYS *


FLUSHALL(删除所有键*慎用)


- 中文显示 redis默认显示二进制,所以无法正常展示中文,需要退出重新进入redis,在登录的时候加上 --raw表示以原始形式显示内容
redis-cli --raw


CLEAR(清屏)
和linux一样,使用clear清屏


TTL(查看带有过期时间的键值对)
TTL key:用TTL(time to live)命令来查看键值对的过期时间,显示-1就是没有过期时间,显示-2就是过期了,这个键就查不到了
TTL name


EXPIRE(设置过期时间)
EXPIRE key seconds:使用EXPIRE来设置过期时间
20表示20秒
EXPIRE name 20


LIST
PUSH(添加元素)
LPUSH key value [value ...]
RPUSH key value [value ...]
用LPUSH或RPUSH来将元素添加到列表的头部或尾部
添加字母(letter)列表,值为a,也可以添加多个元素,比如LPUSH c d e空格隔开,由于LPUSH是从头部添加,所以顺序是跟栈一样后进的在前 e d c,RPUSH 是在尾部添加,所以是按顺序的
LPUSH letter a LPUSH letter b LPUSH letter c d e RPUSH letter f g h
获取列表内容使用LRANGE命令
LRANGE key start stop:格式参考,key 起始位置和结束位置
起始0表示第一个元素 -1表示最后一个元素
LRANGE letter 0 -1








POP(删除元素)
LPOP key
RPOP key
用LPOP和RPOP分别从头部和尾部删除元素 pop命令不需要指定,会返回被删除的元素,后面加数字表示删除多个(redis5.0不支持删除多个元素)
LPOP letter RPOP letter


LLEN(查看列表长度)
LLEN key
LTRIM(删除设置的值范围以外的元素)
LTRIM key start stop
删除了2-3范围以外的元素,也就是只保留2和3两个元素(d是第0个)
LLEN letter LTRIM letter 2 3


SET(无序集合)
Set 是一种无序的集合数据结构,它可以用来存储字符串类型的元素,并且确保每个元素都是唯一的,即集合中不会有重复的元素。
SADD(添加元素)
SADD key member [member ...]:将一个或多个成员元素加入到集合中,已经存在于集合的成员将被忽略。
添加一个或多个
SADD course Redis Mysql Java


SMEMBERS(获取集合中的所有成员)
SMEMBERS key:返回集合中的所有成员。
SMEMBERS course








SISMEMBER (判断元素是否存在于集合中)
SISMEMBER key member:判断元素是否是集合 key 的成员。
SISMEMBER course Redis SISMEMBER course Python


SREM(移除元素)
SREM key member [member ...]:移除集合中的一个或多个成员,不存在的成员将被忽略。
输出1则是删除成功,0则是没删除
SREM course Java SMEMBERS course


SRANDMEMBER( 随机获取元素)
SRANDMEMBER key [count]:从集合中随机获取一个或多个成员。
SRANDMEMBER course 3


扩展内容
集合运算
-
SINTER key [key ...]:返回给定所有集合的交集。 -
SUNION key [key ...]:返回所有给定集合的并集。 -
SDIFF key [key ...]:返回给定所有集合的差集。
集合数量
SCARD key:获取集合的成员数量。
移动元素
SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合。
批量操作
-
SPOP key [count]:移除并返回集合中的一个或多个随机成员。 -
SSCAN key cursor [MATCH pattern] [COUNT count]:迭代集合中的元素。
SortedSet有序集合
Redis 的有序集合是一种特殊类型的集合,它不仅允许我们存储唯一、非重复的字符串元素,还允许我们为每个元素关联一个分数(score),从而可以根据分数对集合中的元素进行排序。
ZADD(添加元素)
ZADD key score1 member1 [score2 member2 ...]:向有序集合添加一个或多个成员,或者更新已存在成员的分数。
ZADD result 680 清华 660 北大 650 复旦 640 浙大


ZRANGE(范围查询)
ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合指定区间内的成员。
ZRANGE RESULT 0 -1


ZREVRANGE key start stop [WITHSCORES]:返回有序集中指定区间内的成员,通过索引,分数从高到低。,加入WITHSCORES,输出分数
ZREVRANGE result 0 -1


ZSCORE(获取分数)
ZSCORE key member:返回有序集中,成员的分数值。
ZSCORE result 清华


ZRANK(获取排名)
ZRANK key member:返回有序集合中指定成员的排名。从小到大
查询清华 排序是从小到大的index =3
ZRANK result 清华


ZREVRANK key member:返回有序集合中指定成员的倒序排名。从大到小
查询清华,排序是从大到小的index =0
ZREVANK result 清华


其他操作
移除元素
ZREM key member [member ...]:移除有序集合中的一个或多个成员。
增加分数
ZINCRBY key increment member:为有序集合中的成员增加分数。
分数范围查询
-
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:返回有序集合中指定分数区间的成员列表。 -
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:同上,分数从高到低排列。
移除指定范围的元素
-
ZREMRANGEBYRANK key start stop:移除有序集合中给定的排名区间的所有成员。 -
ZREMRANGEBYSCORE key min max:移除有序集合中给定的分数区间的所有成员。
集合运算
-
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]:计算给定的一个或多个有序集的交集,其中每个集合成员的分数默认是所有给定集 合中该成员分数之和,可以通过WEIGHTS和AGGREGATE选项来修改。 -
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]:计算给定的一个或多个有序集的并集,并存储在新的有序集合destination中。
集合数量
-
ZCARD key:获取有序集合的成员数量。 -
ZCOUNT key min max:计算在有序集合中指定区间分数的成员数。
批量操作
ZSCAN key cursor [MATCH pattern] [COUNT count]:迭代有序集合中的元素(包括元素成员和元素分值)。
哈希 Hash
在 Redis 中,哈希(Hash)是一种数据结构,用于存储键值对集合。哈希特别适合表示对象,是一个字符类型的字段和值的映射表。在 Redis 中,哈希存储的数据结构类似于编程语言中的哈希表或字典。
HSET(设置值)
HSET key field value:为哈希表中的字段赋值。
HSET person name jorn HSET person age 100


HGET(获取值)
HGET key field:获取哈希表中字段的值。
HGET person name HGET person age


HGETALL(获取所有值)
HGETALL key:获取哈希表中所有的字段和值。
HGETALL person


HDEL(删除键值对)
HDEL key field [field ...]:删除一个或多个哈希表字段。
HDEL person age


HEXISTS(判断是否存在)
HEXISTS key field:检查哈希表中是否存在指定的字段。存在返回1,不存在返回0
HEXISTS person age HEXISTS person name


HKEYS(获取字段)
HKEYS key:获取哈希表中的所有字段名。
HKEYS person
HVALS(获取值)
HVALS key:获取哈希表中的所有值。
HVALS person


Redis发布订阅
使用PUBLISH将消息发布到指定频道,使用SUBSCRIBE来订阅这个频道,订阅者一旦进入订阅状态,将只能接收消息,不能执行其他 Redis 命令
subscribe channel [channel ...]:订阅某个频道的名称或多个频道
publish channel message:发布某个频道带上要发布的信息
subscribe myChannel
publish myChannel good

可以有多个客户端订阅一个频道


一个客户端订阅多个频道

消息队列 Stream
Redis Stream 是 Redis 5.0 引入的一种新的数据结构,用于存储时间序列数据,例如日志、事件、消息等。Stream 提供了持久化、可重放的消息流功能,并且支持多个消费者以不同的消费组进行消费。
XADD(添加消息)
XADD key ID field string [field string ...]:向 Stream 添加消息,包含key和内容。
XADD mystream * course redis XADD mystream * course git XADD mystream * course docker
其中 * 是一个特殊的 ID,表示让 Redis 自动生成一个新的时间戳 ID。


XRANGE(查看消息)
xrange key start end [COUNT count]:获取对应key的指定开始结尾或者指定数量的所有值,可以用- +来表示获取所有键和值
XRANGE mystream - +


XDEL(删除消息)
XDEL key ID [ID ...]:删除 某个或多个id的消息。
XDEL mystream 1722173332240-0


XTRIM(删除指定数量的消息)
XTRIM key MAXLEN [~] count:XTRIM 用于调整 Stream 的消息数量,以优化内存使用。这个命令可以用来删除 Stream 中指定数量的消息,或者删除最早的消息直到保留的消息数量达到指定的数量,如果 maxlen 是 0,则 Stream 将被清空。
XTRIM mystream MAXLEN 0


XREAD(读取消息)
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]:从 Stream 中读取消息。
和XRANGE的区别:XREAD默认是非阻塞的,需要指定 BLOCK 参数来设置阻塞超时时间。而 XRANGE 默认是阻塞的。
XREAD count 2 block 1000 streams base 0
count 2表示一次读取两条消息,block 1000表示没有消息就阻塞1000ms,Streams base 0表示在消息队列base里从头开始读取


如果0改成比消息队列最大还大的一个值,比如5,就会阻塞1秒返回nil
XREAD count 2 block 1000 streams base 5


XGROUP(消费者组)
XGROUP CREATE group option]:创建一个消费者组,消费者组是一种用于管理消息消费的机制,它可以让你在同一个 Stream 中创建多个消费者,每个消费者可以独立地消费消息,而不会与其他消费者冲突。
XGROUP CREATE mystream mygroup 0


XINFO(查看消息组的信息)
XINFO GROUPS key:查看某个消息组的信息
会返回组的名称,消费者的数量。待处理的消息等
XINFO groups mystream






