Java核心-redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Java核心-redis

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 

应用场景:

  1. 最新消息排行榜(bilibili动态功能)
  2. 可以当做一个消息队列,来完成程序之间的信息交换
    以完成多程序之间的消息交换。可以⽤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 ...]

应用场景:

  1. 求共同的好友
    A的好友是一个无序集合,B的好友也是一个无序集合,那么这个时候可以去求这两个集合的交集,就得到了共同的好友
  2. 好友推荐

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中读取
  • 可能出现数据不一致的问题
  • 存入搜索引擎中
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
14天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
1天前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
1月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
|
1月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
|
1月前
|
缓存 NoSQL Java
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
|
1月前
|
NoSQL 安全 Java
Java Spring Boot中使用Shiro、JWT和Redis实现用户登录鉴权
Java Spring Boot中使用Shiro、JWT和Redis实现用户登录鉴权
|
存储 SQL 缓存
Java-Redis笔记
  Redis   1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库   1.1.什么是NOSQL   NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。   随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
141 0
|
14天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
30天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
58 0