当前位置:   article > 正文

Redis高级特性完整总结

redis高级特性

(一)设置key的生存时间

Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它
的一个典型应用场景是:手机验证码
我们平时在登录或者注册的时候,手机会接收到一个验证码,上面会提示验证码的过期时间,过了这个时间之后这个验证码就不能用了。
expire支持以下操作

命令     格式     解释
expire   expire key seconds    设置key的过期时间(单位:秒)
ttl      ttl key               获取key的剩余有效时间
persist  persist key           取消key的过期时间
expireat expireat key timestamp 设置UNIX时间戳的过期时间
  • 1
  • 2
  • 3
  • 4
  • 5

总结一下:
当key永久存在的时候,执行ttl返回的是-1,
当key被设置了过期时间之后,执行ttl返回的就是这个key剩余的有效时间
当key已经被删除了,不存在的时候,执行ttl返回的是-2

(二)pipline管道

原理:
在这里插入图片描述
针对批量操作数据或者批量初始化数据的时候使用,效率高
Redis的pipeline功能在命令行中没有实现,在Java客户端(jedis)中是可以使用的

不使用管道的时候,我们每执行一条命令都需要和redis服务器交互一次
使用管道之后,可以实现一次提交一批命令,这一批命令只需要和redis服务器交互一次,所以就提高了性能。
这个功能就类似于mysql中的batch批处理。

使用管道的代码:

package redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
/**
 * pipleline管道的使用
 */
public class PipelineOp {
    public static void main(String[] args) {
        Jedis jedis = RedisUtils.getJedis();
        long startTime = System.currentTimeMillis();
        for(int i =0;i<100000;i++){
            jedis.set("a"+i,"a"+i);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("不适用管道耗时"+(endTime-startTime));

        //使用管道
        Pipeline pipeline=jedis.pipelined(); 
        long start2Time = System.currentTimeMillis();
        for(int i =0;i<100000;i++){
            jedis.set("b"+i,"b"+i);
        }
        long endTime2 = System.currentTimeMillis();
        System.out.println("适用管道耗时"+(endTime2-start2Time));
        
    }   
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

(三)Redis的持久化

Redis持久化简单理解就是把内存中的数据持久化到磁盘中 可以保证Reids重启之后还能恢复之前的数据
Redis支持两种持久化,可以 单独使用 或者 组合使用RDB 和 AOF
RDB是Redis默认的持久化机制

(1)Redis持久化之RDB

RDB持久化是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据执行快照操作并存储到硬盘上,默认存储在 dump.rdb 文件中

Redis什么时候会执行快照?
Redis执行快照的时机是由以下参数控制的,这些参数是在redis.conf文件中的。

save 900 1
save 300 10
save 60 10000
  • 1
  • 2
  • 3

save 900 1 表示900秒内至少一个key被更改则进行快照
这里面的三个时机哪个先满足都会执行快照操作。

  • RDB的优点:由于存储的有数据快照文件,恢复数据很方便
  • RDB的缺点:会丢失最后一次快照以后更改的所有数据,因为两次快照之间是由一个时间差的,这一段时
    间之内修改的数据可能会丢。

(2)Redis持久化之AOF

AOF持久化是通过日志文件的方式,默认情况下没有开启,可以通过 appendonly 参数开启.

vi redis.conf
....
appendonly yes

  • 1
  • 2
  • 3
  • 4

AOF日志文件的保存位置和RDB文件相同,都是dir参数设置的,默认的文件名是 appendonly.aof

可以试验一下,换一个目录启动redis,发下redis中的数据是空的。关闭之后,重新在之前的目录启动,redis,数据又回来了。
AOF方式只会记录用户的写命令,添加、修改、删除之类的命令,查询命令不会记录,因为查询命令不会影响数据的内容。

那redis什么时候会把用户的写命令同步到aof文件中呢?

# appendfsync always
appendfsync everysec
# appendfsync no
  • 1
  • 2
  • 3
  • 默认是每秒钟执行一次同步操作。appendfsync everysec
  • 也可以实现每执行一次写操作就执行一次同步操作,appendfsync always,但是这样效率会有点低。
    或者使用appendfsync no,表示不主动进行同步,由操作系统来做,30秒执行一次。
  • 如果大家对数据的丢失确实是0容忍的话,可以使用always。
    不过一般情况下,redis中存储的都是一些缓存数据,就算丢了也没关系,程序还会继续往里面写新数据,不会造成多大影响。

(四)Redis的安全策略

(1)设置数据库密码

默认情况下访问redis只要网络能通就可以直接访问,这样其实是有一些不安全的,不过我们一般会限制只能在内网访问,这样其实问题也不大。
redis针对这个问题,也支持给数据库设置密码,在redis.conf中配置

[root@bigdata04 redis-5.0.9]# vi redis.conf
....
requirepass admin
....
  • 1
  • 2
  • 3
  • 4

(2)bind参数的应用

在实际工作中,我们的服务器至少会有3个ip地址
127.0.0.1 这个是本机回环地址
192.168.182.103 这个是本机的内网地址
还有一个是外网地址

我们一般会使用bind绑定内网ip,这样其实就限制了redis服务器的访问范围,不会暴露在外网,此时我们就可以认为redis是安全的了。

(3)命令重命名

咱们前面讲过一个命令是 flushall ,这个命令是很危险的,它可以把redis中的所有数据全部清空
所以在实际工作中一般需要将这个命令给禁用掉,防止误操作。
在redis.conf配置文件中进行设置

[root@bigdata04 redis-5.0.9]# vi redis.conf
....
rename-command flushall ""
....
  • 1
  • 2
  • 3
  • 4

这样修改之后,就把flushall命令给禁用掉了
重启redis服务

(五)Redis的监控指令

monitor可以监控我们对redis的所有操作,如果在线上的服务器上打开了这个功能,这里面就会频繁打
印出来我们对redis数据库的所有操作,这样会影响redis的性能,所以说要慎用。

[root@bigdata04 redis-5.0.9]# redis-cli
127.0.0.1:6379> monitor
OK
1768628815.007443 [0 192.168.182.1:60633] "SET" "imooc" "hello bigdata!"
1768628815.007797 [0 192.168.182.1:60633] "GET" "imooc"
  • 1
  • 2
  • 3
  • 4
  • 5

(六)Info指令

这我们主要关注几个重点的参数

# Redis 服务器版本
redis_version:5.0.9
# Redis服务的可执行文件路径
executable:/data/soft/redis-5.0.9/redis-server
# 启动Redis时使用的配置文件路径
config_file:/data/soft/redis-5.0.9/redis.conf
# 已连接客户端的数量
connected_clients:1
# Redis目前存储数据使用的内容
used_memory_human:15.01M
# Redis可以使用的内存总量,和服务器的内存有关
total_system_memory_human:1.78G
# db0表示0号数据库,keys:表示0号数据库的key总量,expires:表示0号数据库失效被删除的
db0:keys=200001,expires=1,avg_ttl=389945


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/814397
推荐阅读
相关标签
  

闽ICP备14008679号