Redis学习
Redis学习
Redis安装流程
下载Redis包
1 | wget https://download.redis.io/releases/redis-7.2.0.tar.gz |
如果没有wget指令那么使用以下指令下载wget(centos系统)
1 | sudo yum install -y wget |
解压文件
1 | tar -zxvf redis-7.2.0.tar.gz |
进入redis安装目录
1 | cd redis-7.2.0 |
1.Redis是开源的数据库,首先如果要运行话先要用gcc编译器编译好之后才能运行。
如果没有gcc编译器的可以使用yum指令
1 | yum -y install gcc |
2.然后就可以在Redis安装包的根目录下执行
1 | make |
指令,这样就会自动编译Redis的源代码。
让后就可以在redis根目录和根目录下的src目录下各执行一遍
1 | make install |
这样就会将redis的指令全部copy映射到Linux的bin目录,到时候在任何目录下都可以直接执行相关的指令操作redis了。
编译完后就可以直接使用
1 | redis-server #运行 |
将Redis设置成开启自启
1.新建文件
1 | vi /etc/systemd/system/redis.service |
2.进入之后将以下信息复制进去:(注意ExecStart的内容为你们自己的redis.conf文件的路径)
1 | [Unit] |
之后便保存退出。
-
退出之后要让文件生效
1
2systemctl daemon-reload
systemctl enable redis -
然后重启redis
1
systemctl start redis
-
查看redis状态
1
systemctl status redis
如何测试redis服务的性能:
执行指令
1 | redis-benchmark |
查看redis服务是否正常运行:
ping 如果正常------pong(前提是在redis-cli连接后)
查看redis服务器的统计信息
1 | info # 查看redis服务的所有统计信息 |
redis的数据库实例:
作用类似于mysql的数据库实例,redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例;默认情况下:redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15,使用时通过编号来使用数据库;可以通过配置文件,指定redis自动创建的数据库个数:redis的每一个数据库实例本身占用的存储空间是很少的,所以也不造成存储空间的太多浪费。
默认情况下,redis客户端连接的是编号是0的数据库实例
Redis常用指令:
1 | select [index] #index表示某个数据库的编号,这个指令用来选择数据库 |
Redis的特点
1. 支持数据持久化
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2. 支持多种数据结构
Redis不仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3. 支持数据备份
Redis支持数据的备份,即master-slave模式的数据备份
A、字符串类型string
字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。
key | value |
---|---|
username | 张三和李四 |
B、列表类型 list
Redis列表是简单的字符串列表,按照插入顺序排序,元素可以重复。你可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构。
key | value |
---|---|
reqion | 北京 上海 天津 |
C、集合类型set
Redis的Set是string类型的无序无重复集合。
key | value |
---|---|
framework | |
spring | |
mybatis | |
struts |
D、哈希类型hash
Redis hash 是一个string类型的field和value的映射表,hash特表适合用于存储对象。
key | loginuser |
---|---|
field | value |
uname | 张三 |
times | 5 |
region | 北京 |
E、有序集合类型zset(sorted set)
Redis有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
key | value score |
---|---|
salary | |
张三 3500 | |
李四 5000 | |
周丽 8000 |
Redis的Key的操作命令
语法:keys pattern
作用:查找所有符合模式pattern的key,pattern可以使用通配符。
- *:表示0或多个字符,例如:keys *查询所有的key。
- ?:表示单个字符,例如:wo?d,匹配 word,wood
- []:表示选择[]内的一个字符,例如 wo[or]d,匹配word,wood,不匹配wold,woord
语法:exists key
作用:判断key在数据库中是否存在。
- exists key:如果存在返回1,如果不存在则返回0
- exists key [key key …]:返回值是存在的key的数量
语法:move key index
作用:移动指定key到指定的数据库实例
- move key index:将当前库的指定的key移动到了index库内
语法:ttl
作用:查看指定key的剩余生存时间,ttl为time to live的简称
- ttl key:如果key不存在则返回-2,如果key没有设置生存时间,返回-1
语法:expire key seconds
作用:设置key的最大生存时间:expire key seconds
- expire k2 20:给k2设置20秒生存时间,超过20秒k2自动删除
语法:type key
作用:查看指定key的数据类型
语法:rename key newkey
作用:重命名指定的key
语法:del key [key key …]
作用:删除指定key,返回值是返回实际删除 的数量。
Redis中有关string类型数据的操作命令:
语法:set key value
作用:添加一条数据
语法:get key
作用:从Redis中获取string类型的数据,如果key已经存在了则后来的value会把以前的value覆盖掉
语法:append key value
作用:追加字符串,返回追加后的字符串长度,如果key不存在那么作用就类似于set新创建一个key并追加value值。
语法:strlen key
作用:获取key对应value的字符串长度
语法:incr key
作用:将字符串数值进行加1运算,要求key所表示value必须是数值,否则报错。
- incr zsage:返回加1运算之后的数据,如果key不存在,首先设置一个key,值初始化为0,然后进行incr运算。
语法:decr key
作用:将字符串数值进行减1运算,要求key所表示value必须是数值,否则报错。
- decr zsage:返回减1运算之后的数据,如果key不存在,首先设置一个key,值初始化为0,然后进行decr运算。
语法:incrby key offset
作用:将字符串数值进行加offset运算,返回加offset运算之后的数据,要求key所表示value必须是数值,否则报错。
- incrby zsage 10:如果key不存在,首先设置一个key,初始化为0,然后进行incrby运算。
语法:decrby key sffset
作用:将字符串数值进行减offset运算,返回加offset运算之后的数据,要求key所表示value必须是数值,否则报错。
- decrby zsage 10:如果key不存在,首先设置一个key,初始化为0,然后进行decrby运算。
语法: getrange key startIndex endIndex
作用:获取字符串中的子字符串,下标自左至右,从0开始,以后往后,最后一个字符的下标是字符串长多-1;字符串中每一个下标也可以是负数,负下标表示自右至左,从-1开始,一次往前,最右边一个字符的下标是-1。
- getrange key startIndex endIndex:获取字符串key中从startIndex到endIndex的字符组成的子字符串
语法:setrange key startIndex value
作用:用value覆盖从下标为startIndex开始的字符串
语法:setex
作用:设置它最大生命周期
- setex key seconds value
语法:setnx key value
作用:设置string类型的数据value到redis数据库中,当key不存在时设置成功,负责将放弃设置
语法:mset 键1 值1 键2 值2 键3 值3 …
作用:批量将string类型的数据设置到redis中
语法:mget k1 k2 k3 k4 …
作用:批量从redis中获取string类型的数据
语法:msetnx k1 v1 k2 v2 k3 v3 …
作用:批量设置string类型的数据value到redis数据库中,当所有key都不存在时设置成功,负责(只要有一个已经存在),则全部放弃设置。
Redis中有关列表(List)类型的操作指令
Redis列表是简单的字符串列表,按照初入顺序排序,左边(头部))、右边(尾部)或者中间都可以添加元素。链表的操作无论是头或尾效率都极高,但是如果对中间元素进行操作,那效率会大大降低了。
对表类型的数据操作总的思想是通过key和下标操作value,key是数据标识,下标是数据在列表中的位置,value是我们感兴趣的业务数据。
单key-多有序value,一个key对应多个value,多个value之间有顺序,最左侧是表头,最右侧是表尾,每一个元素都有下标,表头元素的下标是0,一次往后排序,最后一个元素下标是列表长度-1;
每一个元素的下标又可以用负数表示,负下标表示从表尾计算,最后一个元素下标用-1表示,元素在列表中的顺序或者下标由放入的顺序来决定。
语法:lpush key value [value value value …]
作用:将一个或者多个值一次插入到列表的表头(左侧)
- lpush ke vlaue [value value …]
语法:lrange key startIndex endIndex
作用:获取指定列表中指定下标区间的元素
语法:rpush key value [value value …]
作用:将一个或者多个值依次插入到列表的表尾(右侧)
语法:lpop key
作用:从指定列表头中移除并且返回表头元素
语法:rpop key
作用:从指定列表尾中移除并且返回表头元素
语法:lindex key index
作用:获取指定列表中指定下标的元素
语法:llen key
作用:获取指定列表的长度
语法:lrem key value
作用:移除列表中某一位元素(value),跟value相等的。
语法:lrem key count value
作用:移除列表中某一些元素,根据count值移除指定列表中跟value相等的数据。当count>0:从列表的左侧移除count个跟value相等的数据;当vount<0:从列表的右侧移除count个跟value相等的数据;当count=0:从列表中移除所有跟value相等的数据
Redis中有关set类型数据的操作命令
Redis的Set是string类型的无序不重复集合。
集合类型的数据操作总的思想是通过key确定集合,key是集合标识,没有下标,只有直接操作业务数据和数据的个数。
语法:sadd key value [value value …]
作用:将一个或者多个元素添加到指定的集合中(添加重复元素时会过滤掉重复元素)
- sadd set01 a b c a:这里实际的只能加入三个元素,也就是a、b、c(不会有重复的数据)
语法:smembers key
作用:获取指定集合中所有的元素
语法:sismember key member
作用:判断指定元素(member)在集合(key)中是否存在,存在就返回1,不存在就返回0
语法:srem key member [member …]
作用:移除指定集合中一个或者多个元素,不存在的元素不被忽略,如果存在那么就会返回成功移除的个数。
语法:srandmember key [count]
作用:随机获取指定集合中的一个或者多个(count)元素,当count>0:随机获取多个元素之间不能重复;当count<0:随机获取的多个元素之间可能重复
语法:spop key [count]
作用:从指定集合中随机移除一个或者多个元素
语法:smove source dest member
作用:将指定集合中的指定元素移动到另一个元素
- smove set1 set2 a:移动a元素到set2集合当中
语法:sdiff key key [key key …]
作用:获取指定一个集合中有、但是其它集合中都没有的元素组成的新集合(差集)
- sdiff set1 set2 set3
语法:sinter key key key [key key …]
作用:获取所有指定集合中都有的元素组成的新集合(交集)
语法:sunion key key [key key …]
作用:获取所有指定集合中所有元素组成的大集合
Redis中有关hash类型数据的操作命令
Redis的hash是一个string类型的key和value的映射表,这里的value是一系列的键值对,hash特别适合用于存储对象。
哈希类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感兴趣的业务数据。
语法:hset key filed1 value1 [field2 value2 …]
作用:将一个或者多个field-value对设置到哈希表中
- hset stu1001 id 1001
语法:hget key field
作用:获取指定哈希表中指定field的值
- hget hash id:获取名为hash的hash表中的id的值
语法:hmset key filed1 value1 [field2 value2 …]
作用:批量设置多个filed-value,作用和前面的hset一样
语法:hmget key field1 [field2 field3 …]
作用:批量获取指定哈希表中的field的值
语法:hgetall key
作用:获取指定哈希表中所有的field和value
语法:hdel key field1 [dield2 field3 …]
作用:从指定哈希表中删除一个或者多个field
语法:hlen key
作用:获取指定哈希表中所有的filed个数
hlen stu1001:获取key为stu1001的哈希表有多个field。
语法:hexists key field
作用:判断指定哈希表中是否存在某一个field,有则返回1,没有则0
语法:hkeys key
作用:获取指定哈希表中所有field列表
语法:hvals key
作用:获取指定哈希表中所有的value列表
语法:hincrby key field int(这里的int只能是整数)
作用:对指定哈希表中指定field值进行加法运算
语法:hincrbyfloat key field float
作用:对指定哈希表中指定field值进行浮点数加法运算
语法:hsetnx key field value
作用:将一个field-value对设置到哈希表中,当key-field已经存在时,则放弃设置,否则继续设置。
Redis中有关zset类型数据的操作命令
Redis有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
本质上是集合,所有元素不能重复。既然有序集合中每一个元素都有顺序,那么也都有下标;有序集合中元素的排序规则由列表中元素的排序规则不一样。
语法:zadd key score member [score member …]
作用:将一个或多个member及其score值加入有序集合
- zadd zset01 20 z1 z2 50 z3 40 z4
语法:zrange key startIndex endIndex [withscores]
作用:获取指定有序集合中指定下标区间的元素,如果加上withscores那么就会显示后面的分数。
- zrange zset01 0 -1
语法:zrangebyscore key min max [withscores]
作用:获取指定有序集合中指定分数区间(闭区间)的元素
语法:zrem key member [member …]
作用:删除有指定有序集合中一个或者多个元素
- zrem zset z3 z4
语法:zcard key
作用:获取指定有序集合中所有元素的个数
语法:zrank key member
作用:获取指定有序集合中指定元素的排名(闭区间)
语法:zcount key min max
作用:获取指定有序集合中分数在指定区间内的元素的个数
语法:zscore key member
作用:获取指定有序集合中指定元素的分数
语法:zrevrank key member
作用:获取指定有序集合中指定元素的排名(按照分数从大到小的排名)
语法:zrevrange key startIndex endIndex [WITHSCORES]
作用:查询有序集合,指定区间内的元素。集合成员按score值从大到小来排序;startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,以此类推;startIndex和 endIndex都可以取负数,表示从后往前取,返回值:指定区间的成员组成的集合。
Redis的配置文件
在redis根目录下提供redis.conf配置文件;可以配置一些redis服务端运行时的一些参数;如果不适用配置文件,那么redis会按照默认的参数运行;如果使用配置文件,在启动redis服务时候必须要指定redis所使用的配置文件
1 | redis-server redis.conf #像这样 |
Redis配置文件中关于网络的配置:
port:指定redis服务所使用的端口,默认使用6379
bind:配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以;一般情况下,都会配置一个ip,而且通常是一个真实的网卡上的IP。
tcp-keepalive:TCP连接保活策略 ,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。
Redis常规配置:
loglevel:配置日志级别,开发阶段可以设置成debug,生成阶段通常设置为notice或者warning。
logfile:指定日志文件。redis在运行过程中,会输出一些日志信息:默认情况下,这些日志信息会输出到控制台:我们可以使用logfile配置日志文件,使redis把日志信息输出到文件里面。要保证日志文件所在目录必须存在,文件可以不存在。还要在redis启动时指定所使用的配置文件,否则配置不起作用。
databases:配置redis服务默认创建的数据库实例个数,默认值是16
Redis的安全配置
requirepass:配置Redis的访问密码。默认不配置密码,即访问不需要密码验证。此配置项需要在prorected-mode=yes时起作用。使用密码登录客户端:
1 | redis-cli -h ip -p 6379 -a pwd |
redis的持久化:redis提供持久化策略,在适当的时机采用适当手段把内存中的数据持久化到磁盘中,每次redis服务启动时都可以把磁盘上的数据再次加载内存中使用。
Redis的RDB配置
RDB策略 :在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作。
1、save
1分钟内改变1万次
或者5分钟内改变了10次
或者15分钟内改变了1次
如果要禁止Redis的持久化功能,则把所有的save配置都注释掉。
2、stop-writes-on-bgsave-error:当bgsave快照操作出错时停止写数据到磁盘,这样能保证内存珊瑚橘和磁盘数据的一致性,但如果不在乎这种一致性,要在bgsave快照操作出错时继续写操作,这里需要配置为no。
3、rdbcompression:设置对于存储到磁盘中的快照是否进行压缩,设置为yes时,Redis会采用LZF算法进行压缩;如果不想消耗CPU进行压缩的话,可以设置为no,关闭此功能。
4、rdbchecksum:在存储快照以后,还可以让Redis使用CRC4算法来进行数据校验,但这样会消耗一定的性能,如果系统比较在意性能的提升,可以设置为no,关闭此功能。
5、dbfilename:Redis持久化数据生成的文件名,默认是dump.rdb,也可以自己配置。
6、dir:Redis持久化数据生成文件保存的目录,默认是./即redis的启动目录,也可以自己配置。
Redis的AOF策略:
AOF策略:采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新执行一遍操作日志中的指令。redis默认不开启,效率低。
appendonly:配置是否开启AOF策略,默认为no即为关闭
appendfilename:配置操作日志文件
小结:根据数据的特点决定开启哪种持久化策略;一般情况,开启RDB足够了。
Redis的事务:
事务:把一组数据库命令放在一起执行,保证操作的原子性,要么同时成功,要么同时失败。
Redis的事务:允许在把一组redis数据库命令放在一起执行,把命令进行序列化,然后一起执行,保证部分原子性
1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行、事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用watch命令监控某些键。
2、不保证事务的原子性:redis同一事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis的事务没有回滚。Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。
1)multi:用来标记一个事务的开始。
2)exec:用来执行事务队列中所有的命令。
3)redis的事务只能保证部分原子性:
a)如果一组命令中,有在加入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性。
1 | multi |
b)如果一组命令中,在压入队列过程中正常,但是在执行事务 队列命令时发生了错误,则只会影响发生错误的命令,不会影响其他命令的执行,这时就不能保证事务的原子性。
1 | multi |
4)discard:清楚所有已经压入队列中的命令,并且结束整个事务。
1 | set k5 v5 |
5) watch:监控某一个键,当事务在执行过程中,此键代表的值发生了变化,则本事务放弃执行,否则正常执行。
1 | set balance 100 |
6)unwatch:放弃监控所有的键。
Redis消息的发布与订阅
redis客户端订阅频道,消息的发布者往频道上发布消息,所有订阅此频道的客户端都能够接受到
1)subscribe ch1 ch2 [ch3 ch4 …]:定义频道
2)publish ch1 message:发布消息,这里是往ch1发送message
3)psubcribe:订阅一个或者多个频道的消息,频道名支持通配符。
- subscribe news.*