一天肝完Redis全是精华(实战操作汇总/1024特别奉献)
Posted 虫链Java Library
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天肝完Redis全是精华(实战操作汇总/1024特别奉献)相关的知识,希望对你有一定的参考价值。
Redis 简介
官网:https://redis.io/
菜鸟教程:https://www.runoob.com/redis/redis-tutorial.html
Redis是什么?
- redis是一种数据库,C语言编写的,开源的,基于内存运行并支持持久化的,高性能的NoSQL数据库。Reids中的数据大部分时间都是存储内存中,适合存储频繁访问,数据量比较小的数据。
数据库应用的发展历程
- 单机数据库时代 > 缓存,水平切分时代 > 读写分离时代 > 分表分库时代(集群)
Redis的特点
- 支持数据持久化,redis支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 支持多种数据结构,redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- 支持数据备份,redis支持数据的备份,即master-slave模式的数据备份。
文章目录
安装 Redis
- 重要:不想下载的可以关注文章最后的公众号,根据引导获取Redis,Xshell,Xftp,RedisDesktopManager等一系列安装包。
Linux上安装Redis
- 前往官网下载安装包 (官网链接在文章开头)
- 使用Xftp工具将下载好的安装包传入Linux服务器中的
/home
目录下
- 执行命令对安装包进行解压
tar -zxf redis-6.2.5.tar.gz
- 进入解压文件目录使用
make
对解压的Redis文件进行编译(注意redis-6.2.5才是我刚刚下载的redis)
编译完成之后,可以看到解压文件redis-6.2.5 中会有对应的src、conf等文件夹
- 上述编译没问题后,进入src文件夹,执行
make install
进行Redis安装。
- 如上图展示就说明安装成功了,怎么连接后续命令会有讲到。
Docker中安装Redis并挂载
- Docker中安装并挂载Redis请参考文章:Docker常用实战操作汇总,这玩意就这么简单!(精心整理)
- 这里就不做叙述了我们直接进入实战吧。
操作 Redis
- 这一小节主要介绍启动连接以及退出Redis
一.启动Redis服务
- Redis启动后默认占用的端口号为:6379,出现盒子图标就代表启动成功了。
Redis的三种启动方式
- 前台启动,在任何目录下执行,需要通过 ctrl+c退出
redis-server
- 后台启动(推荐使用)在任何目录下执行
redis-server &
- 启动 redis服务时,指定配置文件
redis-server redis.conf &
二.查看Redis服务
ps -ef|grep redis
三.关闭Redis服务
redis-cli shutdown
四.连接Redis客户端
-
Rides客户端是一个程序,通过网络连接到Redis服务器,从而实现根Redis服务器的交互。
-
Redis客户端发送命令,同时显示Redis服务器的处理结果。
-
redis-cli:是redis自带的客户端,使用命令redis-cli就可以启动redis的客户端程序。
常用连接方式
- 连接本机的6379端口上的redis服务(需要先启动服务)
redis-cli
常用参数
-p
:端口号-h
:ip地址
redis-cli -h ip地址 -p 端口号
五.退出Redis客户端
- 退出客户端有两种方式
exit
或
quit
Redis 的基本知识
一.测试Redis服务的性能
redis-benchmark
可选参数
-h
:ip地址-p
:端口号
redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100
- SET/GET 100 bytes 检测host为127.0.0.1 端口为6379的redis服务器性能
二.查看Redis服务是否正常
ping
- 使用这个命令需要先连接客户端
- 如果正常运行返回 pong
三.查看Redis服务器的所有统计信息
- info命令的使用方法有三种
info #部分Redis系统状态统计信息。
info all #全部Redis系统状态统计信息。
info section #某一块的系统状态统计信息,其中section可以忽略大小写。
- 这个命令也需要连接redis客户端使用
- 下面我们来 一 一解读每一个结果的作用
info Server模块
- info Server模块,包含了Redis服务本身的一些信息,例如版本号、运行模式、操作系统的版本、TCP端口等
属性名 | 属性值 | 属性描述 |
---|---|---|
redis_version | 6.2.5 | Redis服务版本 |
redis_git_sha1 | 00000000 | Git SHA1 |
redis_git_dirty | 0 | Git dirty flag |
redis_build_id | 90492ac0856c040e | Redis build id |
redis_mode | standalone | 运行模式,分为:Cluster 、Sentinel、Standalone |
os | Linux 3.10.0-1160.11.1.el7.x86_64 x86_64 | Redis所在机器的操作系统 |
arch_bits | 64 | 架构(32或64位) |
multiplexing_api | epoll | Redis所使用的事件处理机制 |
gcc_version | 4.8.5 | 编译Redis时所使用的GCC版本 |
process_id | 10444 | Redis服务进程的PID |
run_id | d688494fa4cac3cdcbc30fa6e79f0243b3873e92 | Redis服务的标识符 |
tcp_port | 6379 | 监听端口 |
uptime_in_seconds | 15091 | 自 Redis 服务启动以来,运行的秒数 |
uptime_in_days | 0 | 自 Redis 服务启动以来,运行的天数 |
hz | 10 | serverCron每秒运行次数 |
lru_clock | 5080008 | 以分钟为单位进行自增的时钟,用于LRU管理 |
config_file | Redis的配置文件 |
四.Redis的数据库实例
-
作用类似于mysql数据库实例,redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例,默认情况下
redis会创建16个数据库实例,并且给这些数据库实例进行编号,这些编号从0开始,一直到15,使用时通过编号来使用数据库
。可以通过配置文件,指定redis自动创建的数据库个数,redis的每一个数据库实例本身占用的存储空间是很少的,所以也不会造成存储空间的浪费。 -
默认情况下,redis客户端连接的是编号0的数据库实例
五.切换数据库
- 切换数据库语法 index 表示数据库的编号
select index
六.查看当前数据库实例中所有key的数量
dbsize
七.清空数据库实例
- 清空当前数据库所有实例
flushdb
- 清空所有数据库的所有实例
flushall
八.查看redis中的配置信息
- 查看redis中的所有配置信息
config get *
- 查看指定配置信息
config get [配置参数名]
Redis 的数据结构
- 程序是用来处理数据的,ridis是用来存储数据的,程序处理完的数据要存储到redis中,不同特点的数据要存储在redis中不同类型的数据结构中。
一.字符串类型String
- 字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片,最大512M。
key | value |
---|---|
username | 张三和李四 |
Redis中关于String类型的操作命令
1.设置(添加)字符串类型的数据
- 加入一条sring类型的数据,
注意:如果key已经存在了会覆盖之前的数据
set key value
2.加入一条sring类型的数据,当key不存在时设置成功,否则,则放弃设置
setnx key value
二.列表类型list
- ridis列表是简单的字符串列表,按照插入顺序排序,元素可以重复,你可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构。
key | value |
---|---|
reqion | 北京 上海 天津 |
三.集合类型 set
- Redis的Set是string类型的无序不可重复集合。
key | value |
---|---|
spring | |
framework | mybatis |
struts |
四.哈希类型 hash
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
key | loginuser |
---|---|
fieid | value |
uname | 张三 |
times | 5 |
region | 北京 |
五.有序集合zset (sorted set)
- redis有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员,不同的是zset的每个元素都会联系一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
key | value score |
---|---|
张三 3500 | |
salary | 李四 5000 |
王五 8000 |
Redis 中关于Key的常用操作命令
- 开始之前让我们先来了解一样Redis中三个常用通配符
一.通配符
*
:匹配0个或者多个字符?
:匹配一个字符[]
:匹配[]里面的一个字符
二.查看数据库中的key
- 注意:需要在Redis客户端中执行
keys pattern
- 作用:查找所有符合模式pattern的key,pattern可以使用
通配符
。
查询所有的key
keys *
查询m开头的key
keys m*
查询m开头任意结尾且中间包含li的数据
keys m[li]*
三.判断key在数据库中是否存在
- 判断key是否存在如果存在,则返回1,不存在则返回0
exists key
- 判断多个key 是否存在,返回值是存在的key的数量,一个不存在则返回0
四.移动指定key到指定的数据库实例
move key index
五.查看指定key的剩余生存时间
- 查看指定key的剩余生存时间,如果key没有设置生存时间,返回-1表示永远存在,如果key不存在则返回-2
ttl key
六.设置key的最大生存时间
- 设置key的最大生存时间,单位是秒,从设置后开始倒计时,计时结束后自动删除
expire key secondes
七.查看指定key的数据类型
type key
八.重命名key
rename key newkey
九.删除key
- 删除指定的key(根据key删除一条数据),返回值是实际删除的key的数量
del key
- 删除多个key(多条数据)
del key1 key2 key3
String类型的操作命令
1.添加字符串类型的数据
加入一条sring类型的数据,注意:如果key已经存在了会覆盖之前的数据
set key value
加入一条sring类型的数据,当key不存在时设置成功,否则,则放弃设置
setnx key value
2.从redis中获取string类型的数据
get key
3.追加字符串
追加字符串,返回追加后的字符串长度,如果key不存在则会创建一个新的key,并设置进redis中
append key value
4.获取字符串的长度
strlen key
5.将字符串数值进行加数运算
加1运算
- 要求:
key所表示的value必须是数值否则报错
。返回值为加1运算之后的数据,如果key不存在,首先设置一个key,初始化为0,然后进行incr运算。
incr key
6.将字符串数值进行加offset运算
offset 表示任意的一个数
- 要求:
key所表示的value必须是数值否则报错
。返回值为加1运算之后的数据,如果key不存在,首先设置一个key,初始化为0,然后进行incrby运算。
incrby key offset
7.将字符串数值进行减数运算
减1运算
- 要求:
key所表示的value必须是数值否则报错
。返回值为减1运算之后的数据,如果key不存在,首先设置一个key,初始化为0,然后进行decr运算。
decr key
8.将字符串数值进行减offset运算
- 要求:
key所表示的value必须是数值否则报错
。返回值为减1运算之后的数据,如果key不存在,首先设置一个key,初始化为0,然后进行decrby运算。
offset 表示任意的一个数
decrby key offset
9.截取字符串
-
获取字符串key中从startIndex到endIndex的字符组成的子字符串,字符串下标自左至右,从0开始,依次往后,最后一个字符的下标是字符串长度-1,截取到的字符串包含,startIndex和endIndex。
-
字符串中每一个下标也可以是负数,负下标表示自右至左,从-1开始,依次往前。-1, -2, -3, -4
getrange key startIndex endIndex
10.覆盖指定下标开始的字符串
- 用value覆盖从下标为startIndex开始的字符串,能覆盖几个字符就覆盖几个字符
setrange key startIndex value
11.设置字符串的最大生命周期
setex key seconds value
12.批量设置(添加)数据
批量将string类型数据设置到redis中
mset 键1 值1 键2 值2
批量设置字符串,当所有的key都不存在时设置成功,否则(只要有一个已经存在),则全部放弃设置
msetnx key1 value1 key2 value2
13.批量获取数据
如果key不存在则返回空
mget key1 key2 key3 key4 key5
list类型数据的操作命令
- list类型:单key-多有序value,一个key对应多个value,多个value之间有顺序,最左侧是表头,最右侧是表尾,每一个元素都有下标,表头元素的下标是0,依次往后排序,最后一个元素下标是列表长度-1,每一个元素的下标又可以用负数表示,负下标表示从表尾计算,最后一个元素下标用-1表示,元素在列表中的顺序或者下标由放入的顺序来决定
1.将一个或多个值依次插入列表
将一个或多个值依次插入列表的表头(左侧)值可以有一个或者多个,依次向左插入,先插入的在表尾,后插入的数据在表头
lpush key value value value value
将一个或多个值依次插入列表的表尾(右侧)值可以有一个或者多个,依次向右插入,先插入的在头,后插入的数据在表尾
rpush key value value value value
2.获取指定列表中的元素
获取指定列表中指定下标区间的元素
lrange key startIndex endIndex
获取指定列表中指定下标的元素
lindex key index
3.删除列表中的元素
从指定列表中移除并且返回表头元素
lpop key
从指定列表中移除并且返回表尾元素
rpop key
根据count值移除指定列表中跟value相等的数据
count>0:从列表的左侧移除count个跟value相等的数据
count<0:从列表的右侧移除count个跟value相等的数据
count=0:从列表中移除所有跟value相等的数据
lrem key count value
4.获取列表的长度
获取指定列表的长度
llen key
set类型数据的操作命令
- set类型:Reids的Set是string类型的单key多value无序不重复集合,value之间没有顺序不能重复,通过业务数据直接操作集合。
1.向集合中添加元素
添加一个或多个元素到集合中如果value重复则只会添加一个
sadd key value value value
2.查看集合中的元素
smembers key
3.判断元素是否存在
判断指定元素在集合中是否存在,存在返回1不存在返回0
sismember key
4.获取指定集合的长度
scard key
5.移除指定集合中一个或者多个元素
不存在的元素会被忽略,返回值返回成功移除的个数
srem key
6.从集合中随机获取元素
随机获取指定集合中的一个或者多个元素,适用于抽奖环境。
conut>0:随机获取的多个元素之间不能重复
count<0:随机获取的多个元素之间可能重复
srandmember key [count]
7.从集合中随机移除元素
从指定集合中随机移除一个或多个元素,不指定count默认移除一个
spop key [count]
8.移动元素
将指定集合中的指定元素移动到目标集合,如果目标集合中该值已存在则会覆盖。
smove key1 key2 value
9.获取新集合
获取第一个集合中有,但是其它集合中都没有的元素
sdiff key key key key
获取所有指定集合中都有的元素组成的新集合
sinter key key key key
获取所有指定集合中所有元素组成的大集合
sunion key key key key
hash类型数据的操作命令
-
hash类型:单key:field-value field-value field-value 例如:student:id-1001 name-zhangsan age-15
-
Redis的hash是一个String类型的key和value的映射表,这里的value是一系列的键值对,hash特别适用于存储对象。
-
哈希类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感兴趣的业务数据。
1.向哈希表添加数据
将一个多或多个field-value对设置到哈希表中,如果key field已经存在,value会把以前的值覆盖掉
hset key filed1 value1 [field2 value2]
将一个field-value对设置到哈希表中,当field已经存在时,则放弃设置。返回0表示设置失败,1表示设置成功
hsetnx key field value field value
2.获取哈希表中的数据
获取指定哈希表中的指定field的值
hget key field
批量获取指定哈希表中的field的值
hmget key field1 dield2 field3
获取指定哈希表中所有的field和value
hgetall key
判断指定哈希表中是否存在某一个field,存在返回1不存在返回0
hexists key field
获取指定哈希表中所有的field列表
hkeys key
获取指定哈希表中所有的value列表
hvals key
3.删除哈希表中的数据
从指定哈希表中删除一个或者多个field
hdel key field1 field2 field3
4.统计哈希表中数据
获取指定哈希表中所有的filed个数
hlen key
5.哈希表数据算数运算
对指定哈希表中指定field值进行加法运算
hincrby key field int
对指定哈希表中指定field值进行浮点数加法运算
hincrbyfloat key field float
Zset集合的操作命令
-
Redis有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
-
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。既然有序集合中每一个元素都有顺序,那么也都有下标,有序集合中元素的排序规则又和列表中元素的排序规则不同。
1.向zset有序集合中添加数据
将一个或者多个member及其score值加入有序集合,如果元素存在则把分数覆盖
zadd key score member
2.获取zset有序集合中的数据
获取指定有序集合中指定下标区间的元素,加上withscores可以看到每个元素的分数。
zrange key startIndex endIndex [withscores]
获取指定有序集合中指定分数区间的元素
zrangebyscore key min max
获取指定有序集合中所有元素的个数
zcard key
获取指定有序集合中分数在指定区间内的元素的个数
zcount key min max
获取指定有序集合中指定元素的排名,排名从0开始,从小到大
zrank key member
获取指定有序集合中指定元素的排名,排名从0开始,从大到小
zrevrank key member
获取指定有序集合中指定元素的分数
zscore key member
3.删除zset有序集合中的数据
删除指定有序集合中一个或者多个元素
zrem key member member member
Redis配置文件
在redis根目录下提供redis.conf配置文件,可以配置一些redis服务端运行时的一些参数,如果不使用配置文件,那么redis会按照默认的参数运行,如果使用配置文件,在启动redis服务时必须指定所使用的配置文件。
1.配置文件中关于网络的配置
port:指定redis服务所使用的端口,默认使用6379
bind:配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以,一般情况下,都会配置一个ip,而且通常是一个真实的ip。
如果配置了port和bind,则客户端连接redis服务时,必须指定端口和ip
连接:redis-cli -h 192.168.11.128 -p 6380
关闭:redis-cli -h 192.168.11.128 -p 6380 shutdown
tcp-keepalive:连接保活策略
2.常规配置
loglevel:配置日志级别,开发阶段可以设置成debug,生产阶段通常设置为notice或者warning
logfile:指定日志文件,redis在运行过程中,会输出一些日志信息,默认情况下,这些日志信息会输出到控制台。我们可以使用logfile配置日志文件,使redis把日志信息输出到指定文件中
databases:配置redis服务默认创建的数据库实例个数,默认值是16。
Redis持久化
redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失。为了解决这个问题,redis提供了持久化功能——RDB和AOF
redis提供持久化策略,在适当的时机采用适当的手段把内存中的数据持久化到磁盘中,每次redis服务启动时,都可以把磁盘上的数据再次加载到内存中使用。
1.RDB策略
RDB策略:在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作。默认策略是:1分钟内改变了1万次,或者5分钟内改变了10次,
RDB策略是redis默认的持久化策略,redis服务开启时这种持久化策略就已经默认开启了。
save:配置持久化策略
dbfilename:配置redis RDB持久化数据存储的文件
dir:配置redis RDB持久化文件所在目录
2.AOF策略
AOF策略:采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新执行一遍操作日志中的指令。效率低,redis默认不开启。
appendonly:配置是否开启AOF策略
appendfilename:配置操作日志文件
小结:根据数据的特点决定开启哪种持久化策略,一般情况,开启RDB足够了。
第十三章 Redis中的事务
事务:把一组数据放在一起执行,保证操作原子性,要么同时成功,要么同时失败。
Redis的事务:允许把一组redis命令放在一起,把命令进行序列化,然后一起执行,保证部分原子性
用来标记一个事务的开启
multi
用来执行事务列队中所有命令
exec
redis的事务只能保证部分原子性
-
如果一组命令中,有在压入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性。
-
如果一组命令中,在压入列队过程中正常,但是在执行事务列队命令时发生了错误,则只会影响发生错误的命令,不会影响其他命令的执行。不能够保证事务的原子性。
清除所有已经压入队列中的命令,并且结束整个事务。
discard
监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行,否则,正常执行。
watch key
放弃监控所有的键
unwatch
SpringBoot集成Redis
- 加入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 在springboot核心配置文件application.propeties中配置redis连接信息:
spring:
redis:
port: 6380
host: 192.168.226.128
- springBoot自动配置RedisTemplate,在需要操作redis的类中注入redisTemplate;
//注入springboot自动配置好的RedisTemplate,泛型里面只能写<String,String>,<Object,Object>
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
- 测试
@Test
void redisTest(){
//字符出序列化器
RedisSerializer redisSerializer=new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer);
//查询缓存
List<User> userList= (List<User>) redisTemplate.opsForValue().get("allUser");
if (null==userList){
//缓存为空,查询一遍数据库
userList=userMapper.selectList(null);
//把数据库查询出来的数据,放入redis中
redisTemplate.opsForValue().set("allUser",userList);
}
userList.forEach(System.out::println)
}
到此整个redis基础就全部整理完毕了,1024祝愿大家节日快乐🌹
以上是关于一天肝完Redis全是精华(实战操作汇总/1024特别奉献)的主要内容,如果未能解决你的问题,请参考以下文章
不要小看一个 Redis!从头到尾全是精华,阿里 Redis 速成笔记太香了
不要小看一个 Redis!从头到尾全是精华,阿里 Redis 速成笔记太香了