这篇开始学习Redis,与spring boot并行学习。
安装redis
redis github
选择与自己电脑匹配的版本,我这边选择ZIP包
解压后,配置环境变量(这样就不需要输入redis路径啦,一劳永逸~)
配置完成后,启动redis
打开cmd,输入以下命令
redis-server.exe redis.windows.conf
测试需要重新打开一个cmd,不能关掉第一个
redis-cli.exe -h 127.0.0.1 -p 6379
注意:6379是redis默认端口
到这,安装就搞定啦。
redis有哪些数据类型呢?
string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(sortedSet有序集合)
1.string,是二进制安全,可以包含任何对象,包括图片,序列化对象等。
注意:每个键最大存储512M
常用字符串命令:
命令 | 描述 |
---|---|
append key value | 如果key存在,则将value添加到已存在value的后面。如果不存在则相当于set |
set key value | 设置指定key的值 |
get key | 获取指定key的值,若key值不存在,则返回nil。若key值不为字符串,则返回错误 |
getrange key start end | 返回key中字符串的值的子字符 |
getset key value | 设置一个key的值,并返回旧值。如果key中没有旧值,则返回nil。通常可以与INCR一起使用。 |
mget key key … | 返回一个或多个给定key的值,如果其中有一个值不存在则返回特殊值nil,所以改命令永不失败。 |
mset key value key value … | 同时设置一个或多个key、value的值,如果key值存在则覆盖旧值 |
MSETNX | 用法与mset等同,但是MSETNX具有原子性,如果key值存在,则所有key值都不设置,要么全部设置,要么全部不设置。 |
SETEX key seconds value | 将值value关联到key,并为key设置生存时间:seconds秒。SETEX具有原子性,设值和设置生存时间是同时进行的 |
SETNX key value | 将值value关联到key,当且仅当key不存在时操作。如果key存在则不进行任何操作 |
SETRANGE key offset value | 覆盖key对应的值,从偏移量offset开始。例如:value 为 888837744 这时 offset为7 设置值为1,则覆盖为:88883711 |
STRLEN key | 返回key值对应的value值的长度 |
set 语法为
SET key value [EX seconds] [PX milliseconds] [NX|XX]
可选参数:
EX 设置键过期时间为seconds秒
set key value EX 100 与 setex key 100 value 等同
PX 设置键过期时间为milliseconds毫秒
set key value PX 20000
NX 只在键不存在的情况进行设置操作
set key value NX 与 setnx key value 等同
XX 只在键存在的情况下进行设置操作
set key value XX
同时XX或EX可以和EX、PX进行混合使用
set key value EX 100 NX
set key value PX 100 XX
如果key不存在,服务端则返回nil,如果存在则返回value
若get的key不是字符串,则返回一个错误
2.hash
是一个string类型的field字段和value值的映射表,特别适合存储对象,redis每个hash都有232-1键值对(40多亿)
常用命令:
命令 | 描述 |
---|---|
hset key field value | 将哈希表key的域field的值设为value,如果key存在,则覆盖新值 |
HSETNX key field value | 将哈希表key的域field的值设为value,当且仅当域不存在,若域存在则不进行操作 |
HMSET key field value field value … | 同时将多个field-value(域-值)设置到哈希表key中,会覆盖哈希表中已存在的域 |
HGET key field | 返回哈希表key中给定域的值,给定域或给定key不存在,则返回nil |
HMGET key field field … | 返回哈希表中一个或多个给定域的值,如果给定域不存在,则返回nil |
HGETALL key | 返回哈希表key中所有域和值,值会再紧跟再域之后,所以返回值的长度是哈希表的两倍 |
HEXISTS key field | 判断哈希表中key给定域是否存在,存在返回1,否则返回0 |
HDEL key field field … | 删除哈希表中key的一个或多个给定域,如果给定域不存在则忽略, 若redis版本在2.4以下,HDEL只允许删除单个给定域,若需要再一个原子时间内删除多个,请将命令放在MULTI、EXEC块内 |
HINCRBY key field increment | 为哈希表中key的给定域做增量操作,增量值可以为负数(即做减法),若给定域不存在,那么在执行之前初始化为0。若给定域的值为字符串,则报错。本操作值限制在64bit有符号数字内 |
HKEYS key | 返回哈希表的key中所有的域,若不存在返回空表 |
HLEN key | 返回哈希表中key的域的数量,若不存在返回0 |
HVALS key | 返回哈希表key中所有域的值的表,若不存在则为空表 |
3.list
是简单的字符串列表,按插入的顺序排序。你可以插入一个值到列表的头部或者尾部。一个列表最多可以包含232-1个元素(40多亿)
命令 | 描述 |
---|---|
MLPOP key key … outtime | LPOP的阻塞版本,若当给定列表中没有元素可供弹出,就会阻塞等待超时时间或者等待新元素进入list。当给定多个key时,按key先后检查每个列表弹出第一个非空列表的头元素 |
BRPOP key key … outtime | 当给定多个key时,按key先后检查每个列表,弹出第一个非空列表的尾元素。其他与MLPOP一致。 |
RPOPLPUSH source destination | 主要执行两个操作:1.返回列表source的尾元素2.将返回的元素放到列表destination的头元素。 这是一个安全的队列 |
BRPOPLPUSH source destination timeout | 这是RPOPLPUSH的阻塞版本,若source不为空则和RPOPLPUSH一样,否则就阻塞。一直等到超时时间或者有客户端为source 执行 LPUSH或RPUSH行为。其余都与RPOPLPUSH一致 |
RPOP key | 移除并范围列表key的尾元素,若key不存在返回nil |
LINDEX key index | 返回列表key下表为index的元素。若index超过list长度则返回nil。可以用-1表示尾部0表示头部 |
LINSERT key after | before pivot value |
LLEN key | 返回列表key的长度,若key不存在则相当于空表返回0,若不是list,返回一个错误 |
LPOP key | 移除并返回key列表的头元素,若key不存在则返回nil |
LPUSH key value value … | 将一个或多个value从左到右放入到表头,如 插入a、b、c返回值就为c、b、a。若key不存在直接执行LPUSH操作,若key存在但不是列表,则返回错误 |
LPUSHX key value | 将value插入到列表key的表头,当且仅当key存在并且是列表。若key不存在,则不进行操作。 |
LRANGE key start stop | start和stop都以0位底,返回以偏移量start和stop为范围的元素,若start值大于列表最大下表end,则判断为空表。若stop比end大,则将end设置为stop。 |
LREM key count value | 根据count移除与value相等的元素。count定义:1.count>0从表头开始找,移除count个元素。2.count<0从表尾开始找,移除count绝对值个元素。3.count=0,移除表中所有与value相同的元素 |
LSET key index value | 将key列表中,下标为index的值设置为value。若index超过列表长度,则返回错误。 |
LTRIM key start stop | 对列表的修剪,两列表中只保留限定区域内(start-stop)的内容,区域外都要删除。 |
RPUSH key value value … | 将一个或多个value插入到列表key的表尾。按值从左到右插入到表尾,如:插入a、b、c则返回值为a、b、c |
RPUSHX key value | 将单个value插入到列表key的表尾,当且仅当key存在并且为列表。若key不存在,则不进行操作。 |
4.set 集合
redis的set是一个无序集合,集合的元素都是唯一的,这就说明集合中不允许出现重复数据。redis的集合是通过哈希表实现的,所以删除、增加、查找复杂度都有O(1)
常用命令:
命令 | 描述 |
---|---|
SADD key member member… | 将member插入到集合中,若集合中存在member则忽略。若key不存在,则创建只包含一个member的集合。若key不是集合,则报错 |
SCARD key | 返回集合key的基数,即集合中所有成员的数量,若key不存在,返回0 |
SDIFF key key… | 返回一个集合的全部成员, 该集合是给定集合的差集 |
SDIFFSTORE destination key key … | 返回集合与SDIFF一致,但是将返回的集合放到destination中,若destination存在则覆盖。 |
SINTER key key … | 返回一个集合的全部成员,该集合是给定集合的交集 |
SINTERSTORE destination key key … | 返回集合与SINTER一致,但是把返回的集合存入了destination中,若destination存在,则覆盖 |
SISMEMBER key member | 判断集合key中是否存在成员member,若有则返回1,若没有或key不存在则返回0 |
SMEMBERS key | 返回集合中的所有成员,key不存在返回空集合 |
SMOVE source destination member | 将member从source中移到destination。若source中不存在member不执行操作,返回0。否则将member移到destination中并将source的member移除。若destination中以存在member,则只讲source的member移除。若source或destination不为集合,则返回错误 |
SPOP key | 移除并返回key中的任意一个成员 |
SRANDMEMBER key [count] | 若只给定key,则随机返回一个成员。count定义:1.count>1并且小于集合的长度则返回count个成员的数组,数组中的成员各不相同,若大于集合的长度则返回整个集合。2.count<0,则返回一个数组,这个数组的成员可能会重复多次,数组的长度为绝对值count |
SREM key member [member…] | 移除集合key中一个或多个member,不存在的member则忽略。在redis2.4版本以前只允许移除单个member |
SUNION key [key …] | 返回一个集合,该集合是所有给定集合的并集。时间复杂度为O(N),N是给定集合成员数量之和 |
SUNIONSTORE destination key [key…] | 返回的集合与SUNION返回的集合一致,但是将返回的结果保存到了destination中。destination存在则覆盖,destination可以是key本身。 |
5.SortedSet 有序集合
与集合一致,都是string类型元素的集合,且不能重复。不同的是,有序集合中的成员都会关联一个double类型的分数,根据分数从小到大进行排序。有序集合中的成员是不能重复,但是分数可以重复。
常用命令: TODO
命令 | 描述 |
---|---|
ZADD key score member [score member…] | 将一个或多个member和对应的score放到集合中。若member已经是有序集的成员,可以改变score的值。score可以是整数或者双精度浮点数。若key存在且不是有序集合则返回错误。 |
ZCARD key | 返回有序集合key的数量 |
ZCOUNT key min max | 返回有序集合中在min<=score<=max范围内的数量 |
ZINCRBY key increment member | 将key集合内的成员member的score加上增量increment,返回member的新的score值 |
ZRANGE key start stop [WITHSCORES] | 返回序集内指定范围的成员。若stop大于序集的最大长度,则返回序集的所有成员,并按从小到大进行排序(ZREVRANGE排序与之相反,其他一致)。start 和 stop都以0位,若下标查询最后一个 stop 可为-1 倒数第二个可为-2 以此类推。添加了WITHSCORES则使成员和对应的score一起返回:member1,score1 … |
ZRANGEBYSCORE key min max [WITHSCORE][LIMIT offset count] | 返回序集集合内min<=score<=max之间的成员,集合排序有score从小到大排序。若score相同,使用字典序来排序。详情参见 |
ZRANK key member | 返回序集内member成员的排序,以score从小到大进行排序,若要以score从大到小排序,则使用ZREVRANK |
ZREM key member [member…] | 移除序集中key内指定的一个或多个member,并返回移除member的数量,不包括被忽略的member。若member不存在则忽略。若key不存在则返回错误。redis2.4以下一次只能移除一个成员 |
ZREMRANGEBYRANK key start stop | 移除序集内排名(RANK)区间的成员,RANK从小到大进行排序,stop以-1为底,代表最后一个成员,以-2为底则代表倒数第二个成员,以此类推。 |
ZREMRANGEBYSCORE key start stop | 移除序集内所有在min<=score<=max返回内的成员 |
ZSCORE key member | 返回序集key对应的成员的score值 |
6.Pub\Sub(发布/订阅)
是一种消息通信模式,发布者(Pub)发送消息,订阅(Sub)者接受消息。
常用命令:
命令 | 描述 |
---|---|
PUBLIC channel message | 将message发送给指定频道channel |
PSUBSCRIBE pattern [pattern…] | 订阅一个或者多个给定模式的频道,每个模式可以用做匹配符,例如:news. 所有前缀为news.的所有频道等 |
PUBSUB CHANNELS [pattern] | 列出至少有一个订阅者的频道,若没有设置pattern则列出所有频道,若有设置,则列出pattern匹配的频道 |
PUBSUB NUMSUB [channel1 channel2] | 返回给定频道的订阅者数量,订阅模式的客户端不计算在内 |
PUBSUB NUMPAT | 返回客户端订阅的所有模式的数量之和。 |
PUNSUBSCRIBE [pattern [pattern…]] | 指示客户端退订所有给定模式,若没有设置给定模式,则退订PUBSCRIBE订阅的所有模式 |
SUBSCRIBE channel [channel…] | 订阅一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel…]] | 指示客户端退订一个或多个频道,若channel没有设置,则退订SUBSCRIBE订阅的所有频道 |
7.Transaction (事务)
redis事务可以一次执行多个命令,有以下三个特征:
- 批量操作会再开启事务(MULTI)后在EXEC命令前,放入队列缓存中。
- 执行事务期间,若有命令b出现问题,命令a执行成功不会回滚,命令c继续执行。
- 执行事务期间,多有其他客户端执行命令,不会讲命令放入到执行队列中。
事务执行的过程:
- 开启事务(MULTI)
- 命令入队列
- 执行事务(EXEC)
常用命令:
命令 | 描述 |
---|---|
WATCH key [key…] | 监听一个或多个key,若事务执行之前这个或这些key被其他命令改动,则事务会被打断。 |
DISCARD | 取消事务,若事务中的key存在监听WATCH,则将取消所有监听。相当于UNWATCH |
UNWATCH | 取消WATCH对key的所有监听,若在执行UNWATCH之前已经执行了EXEC或DISCARD,那么就不再执行UNWATCH,因为执行EXEC就执行事务,因此WATCH命令效果将会产生。执行DISCARD会取消事务,也将取消WATCH。 |
MULTI | 标记一个事务块的开启,事务块内的命令将以顺序放入到队列中,最后以EXEC命令原子性的执行事务 |
8.连接 (connection)
连接命令主要用于连接redis服务器
常用命令:
命令 | 描述 |
---|---|
AUTH password | 通过设置配置文件requirepass值(CONFIG set requirepass ‘密码’)使用密码来保护redis服务器连接。使用密码后,每次连接redis服务器都要用AUTH解锁,否则无法使用其他命令,若密码与设置的值匹配不上则提示invalid password,否则提示ok |
ECHO message | 返回一个特定的信息,测试时使用 |
PING | 客户端向服务器发送PING,若服务端响应则返回一个PONG。通常用于测试服务器是否还在运作,否则可以用来测量延迟性 |
QUIT | 请求关闭服务器与当前客户端的连接,一旦所有等待中的回复顺利返回到客户端,则关闭连接。 |
SELECT index | 切换到指定的服务器,服务器索引号以数字值指定,以0作为起始索引值,默认使用0号数据库 |