Redis
启动
启动服务端
打开命令行,进入redis的安装目录,执行指令
redis-server.exe redis.windows.conf
启动客户端
redis-cli.exe [-h] [-p] -h : 指定host -p : 指定端口号
Redis的核心配置文件
常规配置
# 表示Redis是不是以守护进程(后台进程)的方式运行,windows上面不支持 daemonize no # 当客户端闲置多长时间后关闭连接 0表示不关闭 timeout 0 # 端口号配置 port 6379 # 指绑定的主机地址:是指哪些Ip地址的主机可以来连接这个Redis服务 # 127.0.0.1 指本机才能够访问这个Redis服务 bind 127.0.0.1 # bind 0.0.0.0 指任意的ip地址都可以来连接当前这个Redis服务 # 日志级别 debug | notice | verbose | warning loglevel verbose # 数据库的数量(通常情况下用处不大,默认有16个数据库,默认操作的是编号是0的这个数据库) databases 16 # 密码的配置 requirepass password
持久化配置
将内存中的数据保存到磁盘里面去,这个过程就是持久化
Redis支持两种方式的持久化
- RDB
- AOF
RDB
通过内存快照的方式进行持久化,是默认的持久化策略
配置
# 保存文件的路径,默认是当前路径 dir E:\tmp # 保存文件的名字 dbfilename dump.rdb # RDB持久化的策略 save 900 1 save 300 10 save 60 10000
一旦触发某一个条件,就会从头开始计算
RDB持久化的触发方式
- 当满足条件的时候
- 手动执行save|bgsave
- 服务器正常退出
如何恢复
在redis服务器启动的时候会自动去dir配置的文件夹中寻找对应的文件来完成加载
AOF
AOF:append only file
通过追加日志文件的方式来持久化,追加的是我们执行的写命令,恢复的时候将日志文件中的命令重新执行一遍就实现了恢复的操作
# AOF的总开关 appendonly yes # 文件保存的位置 和RDB文件保存的位置是一致的 dir E:\tmp # 文件的名字 appendfilename "appendonly.aof" # AOF的策略 # 总是同步去写入命令(每收到一条写的指令,就去把这个命令写入文件中) # appendfsync always # 每秒写入一次命令 appendfsync everysec # 不写入命令 # appendfsync no
AOF会生成一个appendonly.aof的文件,这个文件里面保存的是所有的写入的命令。当需要恢复数据库的时候,会依次执行所有的命令来重建整个Redis数据库的内容。
由于时间长了后AOF的文件会越来越大,所以目前采取的方式是精简指令,即只保存最后影响数据的指令
AOF和RDB的优缺点
- AOF可以不丢数据,但RDB不行
- RDB保存和加载快
- RDB适合大内存机器使用,适用于容灾备份,AOF适合生产中的备份
数据结构
常规命令
# 保存 save | bgsave # 验证密码 auth password # 查询所有的key [*这里应该是一个parttern] keys * # 删除Redis所有的库里面的键值对 flushall # 删除当前的库里面的所有的键值对 flushdb
string
与JAVA中的map一致,一个key对应一个value,可以是字符串、数字、二进制等
# 设置一个键值对 set key value # 获取key的值 get key # 给对应的值+1 (原子操作),这个值只能是一个整型 incr key # 给对应的值增加指定的步长,这个值只能是一个整型 incrby key # 批量的get mget key1 key2 [key ...] # 批量的set mset key value [key value ...] # 设置一个key value ,并且指定过期时间 setex key seconds value # set not exists 指当key不存在的时候就去设值(不覆盖) setnx key value
应用场景:我们可以利用incr
这个指令来统计网站的访问量( pv= page view),或者是统计某个大型游戏在线活跃的人数
hash
二维表,key对应的是表名,field相当于属性名,value相当于内容
# 设置指定的hash表中的键值对 hset key field value # 获取指定的hash表中的键值对的值 hget key field # 在一个指定的二维表中,查看指定的field是否存在 # 如果存在,返回1,如果不存在,返回0 hexists key field # 获取二维表中所有的键值对(key - value) hgetall key # 获取二维表中所有的key hkeys # 获取二维表中所有的value hvals # 一次设置二维表中多个键值对 hmset key field value [filed value ...] #一次获取二维表中多个键值对 hmget keys field [field ...] # 获取二维表中的key-value键值对的个数 hlen key # 给指定的value值增加指定的步长 hincrby key value increment # 设置值,不覆盖 hsetnx key value
适合存储对象,
key:对象的名字
field:对象中成员变量的名字
value:成员变量的值
list
相当于一个队列,可以从左右弹出或者推入数据
特点:
- 有序
- 可重复
# 从左端推入元素,value1 在最右边 lpush key value1 value2 value3 [value ...] # 从右端推入元素,value1在最左边 rpush key value1 value2 value3 [value ...] # 从左端推出元素 lpop key # 从右端推出元素 rpop key # 返回当前列表的长度 llen key # 返回指定下边的元素 0表示最左边的元素 lindex key index # 假如list存在,就去push,如果list不存在,就不push lpushx key value # 插入一个元素,注意:pivot是最左边的指定的元素 linsert key BEFORE|AFTER pivot value # 查询一个范围内的值,start 和stop指的是下标 lrange key start stop # 删除指定的元素的前几个值 lrem key count value # 修改指定位置元素的值 lset key index value
应用场景:
- 最新消息排行榜(bilibili动态功能)
- 可以当做一个消息队列,来完成程序之间的信息交换
以完成多程序之间的消息交换。可以⽤push操作将任务存在list中(⽣产者),然后线程在⽤pop操作将任务取出进⾏执⾏。(消费者)
set
无序的集合
- 无序
- 不可重复
- 取出随机
# 往无序集合里面添加元素 sadd key value1 value2 [value ...] # 查询集合里面的所有的元素 smembers key # 判断集合中是否有指定的元素,存在返回1,不存在返回0 sismember key value # 集合中元素的数量 scard key # 从集合中取出元素(删除) (例如年会抽奖小程序) spop key [count] # 从集合中取出元素(不删除) (例如上课点名小程序) srandmember key [count] # 求多个集合的交集 sinter key1 key2 key3 [key ...] # 保存交集到目标集合 sinterstore destination key1 key2 key3 [key ...] # 求并集 sunion key1 key2 key3 # 保存并集到目标集合 sunionstore destination key1 key2 key3 [key ...] # 求差集 sdiff key1 key2 key3 [key ...] # 保存差集到目标集合 (以key1 作为基准) sdiffstore destination key1 key2 key3 [key ...] # 移动元素 smove source destination member # 删除元素 srem key member1 member2 [member ...]
应用场景:
- 求共同的好友
A的好友是一个无序集合,B的好友也是一个无序集合,那么这个时候可以去求这两个集合的交集,就得到了共同的好友 - 好友推荐
sortSet
有序的集合,一般用来存分数,是一个二维表
key:表名
filed:成员属性
score:分数
# 往有序集合中添加 field和其对应的score zadd key score member [score member ...] # 查询有序集合的长度 zcard key # 查询指定成员的分数 zscore key member # 返回指定分数区间(闭区间)内成员的数量 zcount key min max # 给指定的成员增加对应的分数 zincrby key member increment # 返回指定排名区间内的成员(分数从低到高排名) zrange key start stop [withscores] # 返回指定排名区间内的成员(分数从高到低排名) zrevrange key start stop # 获得指定分数区间内的成员(分数从低到高排名) zrangebyscore key min max # 获得指定分数区间内的成员(分数从高到低排名) zrevrangebyscore key max min # 获取指定成员的排名(分数从低到高排序) zrank key member # 获取指定成员的排名(分数从高到低排序) zrevrank key member # 删除指定的成员 zrem key member # 根据一个排名区间删除成员 zremrangebyrank # 根据一个分数区间删除成员 zremrangebyscore
应用场景:积分排行榜。可以帮助我们很方便的取出各个排名区间内的成员,也可以取出各个分数区间内的成员,也可以去通过 zincrby 这个指令随时去更新玩家的分数。
- 消费排行
- 荣耀战力
- 微博打榜
- 天梯排行榜
Jedis
- 导包
<!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
- 使用
public class JedisTest { static Jedis jedis; @BeforeClass public static void init(){ // 创建Jedis客户端 jedis = new Jedis("127.0.0.1",6379); // 认证密码 jedis.auth("cskaoyan"); jedis.select(2); } @Test public void testGet(){ String name = jedis.get("name"); System.out.println(name); }
Jedis的API和命令是一致的,这也是Jedis的优势之一。
Redis的内存淘汰策略
内存淘汰策略:当Redis内存不足的时候,Redis会根据配置的内存淘汰策略淘汰掉部分的数据,来保证写入的成功。
Redis在5.0之后提供了8种内存淘汰策略
- volatile-lru : 从已设置过期时间的数据集中挑选最近最少使用的数据进行淘汰。
LRU:least recent used - volatile-lfu:从已设置过期时间的数据集中,挑选一段时间内使用次数最少的key进行淘汰
- volatile-ttl:从已设置过期时间的数据集中,挑选最近将要过期的数据进行淘汰
- volatile-random: 从已设置过期时间的数据集中,随机选择数据进行淘汰
- allkeys-lru:从所有的数据集中,选择最近最少使用的数据进行淘汰
- allkeys-lfu:从所有的数据集中,选择一段时间内使用次数最少的数据进行淘汰
- allkeys-random:从所有的数据集中,随机选择数据进行淘汰
- no-enviction:禁止淘汰数据
在企业中一般使用allkeys-random来淘汰
- 速度快
- 对于Redis中的数据,允许一定程度上的丢失
总结:
- 假如业务要求对数据的安全性要求较高,但读写速度要求不高,那么就可以把数据存入关系型数据库中
- 假如安全性要求较低,读写速度要求很高,就可以考虑存入redis中
- 假如业务对数据的安全性要求较高,读写速度要求也高
- 将数据在mysql和redis中都存一份,写入数据先写入mysql然后再同步到redis;读取直接从redis中读取
- 可能出现数据不一致的问题
- 存入搜索引擎中