赞
踩
Redis中可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它
的一个典型应用场景是:手机验证码
我们平时在登录或者注册的时候,手机会接收到一个验证码,上面会提示验证码的过期时间,过了这个时间之后这个验证码就不能用了。
expire支持以下操作
命令 格式 解释
expire expire key seconds 设置key的过期时间(单位:秒)
ttl ttl key 获取key的剩余有效时间
persist persist key 取消key的过期时间
expireat expireat key timestamp 设置UNIX时间戳的过期时间
总结一下:
当key永久存在的时候,执行ttl返回的是-1,
当key被设置了过期时间之后,执行ttl返回的就是这个key剩余的有效时间
当key已经被删除了,不存在的时候,执行ttl返回的是-2
原理:
针对批量操作数据或者批量初始化数据的时候使用,效率高
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)); } }
Redis持久化简单理解就是把内存中的数据持久化到磁盘中 可以保证Reids重启之后还能恢复之前的数据
Redis支持两种持久化,可以 单独使用 或者 组合使用RDB 和 AOF
RDB是Redis默认的持久化机制
RDB持久化是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据执行快照操作并存储到硬盘上,默认存储在 dump.rdb 文件中
Redis什么时候会执行快照?
Redis执行快照的时机是由以下参数控制的,这些参数是在redis.conf文件中的。
save 900 1
save 300 10
save 60 10000
save 900 1 表示900秒内至少一个key被更改则进行快照
这里面的三个时机哪个先满足都会执行快照操作。
AOF持久化是通过日志文件的方式,默认情况下没有开启,可以通过 appendonly 参数开启.
vi redis.conf
....
appendonly yes
AOF日志文件的保存位置和RDB文件相同,都是dir参数设置的,默认的文件名是 appendonly.aof
可以试验一下,换一个目录启动redis,发下redis中的数据是空的。关闭之后,重新在之前的目录启动,redis,数据又回来了。
AOF方式只会记录用户的写命令,添加、修改、删除之类的命令,查询命令不会记录,因为查询命令不会影响数据的内容。
那redis什么时候会把用户的写命令同步到aof文件中呢?
# appendfsync always
appendfsync everysec
# appendfsync no
默认情况下访问redis只要网络能通就可以直接访问,这样其实是有一些不安全的,不过我们一般会限制只能在内网访问,这样其实问题也不大。
redis针对这个问题,也支持给数据库设置密码,在redis.conf中配置
[root@bigdata04 redis-5.0.9]# vi redis.conf
....
requirepass admin
....
在实际工作中,我们的服务器至少会有3个ip地址
127.0.0.1 这个是本机回环地址
192.168.182.103 这个是本机的内网地址
还有一个是外网地址
我们一般会使用bind绑定内网ip,这样其实就限制了redis服务器的访问范围,不会暴露在外网,此时我们就可以认为redis是安全的了。
咱们前面讲过一个命令是 flushall ,这个命令是很危险的,它可以把redis中的所有数据全部清空
所以在实际工作中一般需要将这个命令给禁用掉,防止误操作。
在redis.conf配置文件中进行设置
[root@bigdata04 redis-5.0.9]# vi redis.conf
....
rename-command flushall ""
....
这样修改之后,就把flushall命令给禁用掉了
重启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"
这我们主要关注几个重点的参数
# 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。