Redis与Memcache
Redis和Memcache是目前非常流行的两种NoSql数据库,都可以用于服务端缓存。两者有怎样的差异呢?
- 从实现来看:
- redis:单线程
- Memcache:多线程
- 从存储方式来看:
- redis:支持数据持久化和主从备份,数据更安全
- Memcache:数据存于内存,没有持久化功能
- 从功能来看:
- redis:除了基本的k-v 结构外,支持多种其它复杂结构、事务等高级功能
- Memcache:只支持基本k-v 结构
- 从可用性看:
- redis:支持主从备份、数据分片、哨兵监控
- memcache:没有分片功能,需要从客户端支持
可以看出,Redis相比Memcache功能更加强大,支持的数据结构也比较丰富,已经不仅仅是一个缓存服务。而Memcache的功能相对单一。
redis指令
通过help命令可以让我们查看到Redis的指令帮助信息:
在help后面跟上空格,然后按tab键,会看到Redis对命令分组的组名:
主要包含:
- @generic:通用指令
- @string:字符串类型指令
- @list:队列结构指令
- @set:set结构指令
- @sorted_set:可排序的set结构指令
- @hash:hash结构指令
其中除了@generic以外的,对应了Redis中常用的5种数据类型:
- String:等同于java中的,Map<String,String>
- list:等同于java中的Map<String,List>
- set:等同于java中的Map<String,Set>
- sort_set:可排序的set
- hash:等同于java中的:Map<String,Map<String,String>>
可见,Redis中存储数据结构都是类似java的map类型。Redis不同数据类型,只是’map’的值的类型不同。
通用命令
- keys * 查询所有的键
- EXISTS key 判断key是否存在 存在为1 不存在为0
- DEL key [key … ] 删除key,可以删除多个. 返回删除的个数
- EXPIRE key seconds 设置key的过期时间,超过时间后,将会自动删除该key。
- TTL key 查看一个key过期时间 -1永不过期 -2已经过期或不存在
- persist key 移除给定key的生存时间,将这个 key 从带生存时间 key 转换成一个不带生存时间、永不过期的 key 。
持久化
Redis 有两种持久化方案 RDB 和 AOF
RDB
RDB 是默认的持久化方案,当满足一定条件时,会自动将内存中的数据持久化硬盘上
条件在redis.conf文件中配置,格式如下:
save (time) (count)
当满足在time(单位是秒)时间内,至少进行了count次修改后,触发条件,进行RDB快照。
默认的配置如下:
RDB的流程是这样的:
- Redis使用fork函数来复制一份当前进程(父进程)的副本(子进程)
- 父进程继续接收并处理请求,子进程开始把内存中的数据写入硬盘中的临时文件
- 子进程写完后,会使用临时文件代替旧的RDB文件
AOF
默认是关闭的,需要修改配置来开启
appendonly yes # 把默认的no改成yes
AOF持久化的策略是,把每一条服务端接收到的写命令都记录下来,每隔一定时间后,写入硬盘的AOF文件中,当服务器重启后,重新执行这些命令,即可恢复数据。
AOF文件写入的频率是可以配置的:
AOF文件重写:
当记录文件过多时,必然会出现对同一个key的多次操作,此时只需要记录最后一条即可,前面的记录都毫无意义了. 因此满足一定条件时,Redis会对AOF文件进行重写,移除对同一个key的多次操作命令,保留最后一条命令.
默认触发条件:
主从&哨兵&缓存穿透和击穿
以后完善
SpringDataRedis
之前我们使用Redis都是采用的Jedis客户端,既然我们使用了SpringBoot,就要使用spring对redis封装的模板组件.