reids安装
下载地址:https://redis.io/download
解压后,使用make命令编译一下。启动前修改redis.conf文件
修改daemonize的值为yes ,开启后台启动。
把bind XX这项去掉,否则只能特定ip可以访问。
启动
./src/redis-server redis.conf
客户端连接
./src/redis-cli -h 192.168.100.155 -p 6379
推荐一个客户端连接工具:Another Redis Desktop Manager
本地连接可以省略后面的参数
redis使用命令
命令字典:
https://www.redis.net.cn/order/
redis数据结构
String字符串、Hash(哈希)、List(列表)、Set(集合)、zset(sorted set:有序集合)
key和String类型value限制均为512MB
在java中使用
Jedis: 提供比较全面的redis原生指令的支持,上层封装比较弱,集群特性支持度非常低,高级特性几乎没有。
lettuce: 高级redis客户端,支持各种模式的redis连接和操作,高级特性几乎没有。
Redisson: 高级redis客户端,支持各种模式的redis连接和操作,同时提供一大堆的实用功能。
在使用是可以结合monitor命令可以在redis客户端打印收到的命令,结合java代码,可以在学习和测试时,打印出程序发给redis的命令。
在使用过程中,可以修改redis的序列化方式,这样可以在客户端更好的查看。
redis版分布式锁
可以使用Redission,Redission 为 Redis 官网分布式解决方案。
也可以自己实现分布式锁:
思路,设定一个key,获取锁时存值(持锁人信息和重入次数、时间戳等信息),并设定数据有效时间,SETNX 命令来作’尝试获取锁‘动作。
释放锁时要先判断拥有者是否是自己,然后删除,这个需要redis的lua脚本保证两个命令的原子性执行。
redis持久化
Redis 提供了两种持久化方式:RDB(默认) 和AOF
rdb:在不同时间点(每几分钟)将数据快照存储到持久化介质中,定时处理,会丢失时间间隔内的数据。
aof:将操作指令记录下来,回复数据时,将所有操作执行一遍,数据完整度更高一点。aof生成的文件体积大,这个效率慢。
官方的建议是两个同时使用。
reids的集群
主从复制(master/slave):解决读数据的压力问题,但没有解决写数据压力的问题。
集群(直连型):redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。数据通过异步复制,不保证数据的强一致性
集群(proxy 型):Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。
使用redis的哨兵来对redis进行监控很有必要
常见问题:
缓存穿透::查找的key不存在,导致直接访问数据库。
解决思路:1、缓存空数据 2、通过bitmap--布隆过滤器过滤一些请求
缓存击穿:访问的数据,缓存恰好失效了,导致此时数据大量堆积到后端服务
解决思路:使用互斥锁,避免大量进程同时去数据库中加载该数据
缓存雪崩:部分缓存集中在某一个时间失效(与上述区别在于这里是多个数据),导致对后端服务带来很大的压力,
解决:对数据缓存过期时间加一个随机数,将过期时间变得离散。或者提前预热数据(提前将数据加载到缓存中)
在不考虑吞吐量时,加锁、使用队列等方式可以降低压力问题。
数据量大时,慎用keys
Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using sets.
key会阻塞掉redis,十分影响性能。
推荐使用:scan命令
对数据设置过期时间很有必要
哪怕该数据几乎不会变,也请设置一个过期时间,可以把这个时间放长一点。