博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[redis]在Java中使用redis
阅读量:4200 次
发布时间:2019-05-26

本文共 4651 字,大约阅读时间需要 15 分钟。

JAVA与REDIS

在 Java Web 中的应用场景

  • 存储 缓存 用的数据;
  • 需要高速读/写的场合使用它快速读/写;

缓存

特点

  • 读远超于写
  • 在redis中存放数据,服务端可以直接读取内存中的数据
  • 开销大,存常用的和主要的数据

情景

缓存的两种形式:(一些不常更新的数据)

页面缓存经常用在CMS(content manage system)内存管理系统里边(Smarty缓存),如新闻类信息

数据缓存经常会用在页面的具体数据里边

考虑切入点

  • **业务数据常用吗?命中率如何?**如果命中率很低,就没有必要写入缓存;
  • **该业务数据是读操作多,还是写操作多?**如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
  • **业务数据大小如何?**如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;

读操作

  1. 第一次读取数据的时候,Redis 数据会读取失败(此时redies中没有数据自然会读取失败),随即会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
  2. 第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。
  • 读操作的可能性远大于写操作,可用来处理日常中需要经常读去的数据,降低了对数据库的依赖

写操作

  • 更新或者写入的操作,需要多个 Redis 的操作,如果业务数据写次数远大于读次数那么就没有必要使用 Redis。

高速读/写的场合

使用场景

在某一个瞬间或者是某一个短暂的时刻有成千上万的请求到达服务器,如果单纯的使用数据库来进行处理,就算不崩,也会很慢的,轻则造成用户体验极差用户量流失重则数据库瘫痪,服务宕机,为应对高并发需求的场合,可以考虑使用redis

流程步骤

  1. 请求到达服务器时,只是把业务数据在 Redis 上进行读写,而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而满足高速响应的需求
  2. 缓存的数据仍然需要持久化(存入数据库中),所以在一个请求操作完 Redis 的读/写之后,会去判断该高速读写的业务是否结束,这个判断通常会在秒杀商品为0,红包金额为0时成立,如果不成立,则不会操作数据库;如果成立,则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。

在 Java 中使用 Redis

开启redis

一定要开启resis!!!!否则项目根本就连接不上redis!!!!

前提

确保自己的redis安装成功并且能正常使用

启动服务器端

启动成功的标志

在这里插入图片描述

启动客户端

在这里插入图片描述

启动成功标志

在这里插入图片描述

然后就可以开始在Java中使用了

第一步:添加 Jedis 依赖

想要在 Java 中使用 Redis 缓存,需要添加相关的Jar包依赖,打开Maven仓库的网站: ,搜索Jedis:

redis.clients
jedis
3.1.0
  • 测试能否连通redis
@Test    public void redisTester() {        Jedis jedis = new Jedis("127.0.0.1");        System.out.println("connection success");        System.out.println("client is runing:"+jedis.ping());        }

在这里插入图片描述

  • 手欠做一下写入性能的测试
@Test    public void redisTester() {        int i = 0;        try {            long start = System.currentTimeMillis();// 开始毫秒数            while (true) {                long end = System.currentTimeMillis();                if (end - start >= 1000) {// 当大于等于1000毫秒(相当于1秒)时,结束操作                    break;                }                i++;                jedis.set("test" + i, i + "");            }        } finally {// 关闭连接            jedis.close();        }// 打印1秒内对Redis的操作次数        System.out.println("redis每秒操作:" + i + "次");    }}

在这里插入图片描述

  • 再测试一下
  1. 在redis目录下,按shift点右键,打开命令行
  2. 输入:redis-benchmark -n 100000 -q
    在这里插入图片描述
  3. 结论:小破本本撑不住那么高的性能

第二步:使用 Redis 连接池

跟数据库连接池相同,Java Redis也同样提供了类redis.clients.jedis.JedisPool来管理Reids连接池对象,redis.clients.jedis.JedisPoolConfig对连接池进行配置

JedisPoolConfig poolConfig = new JedisPoolConfig();// 最大空闲数poolConfig.setMaxIdle(50);// 最大连接数poolConfig.setMaxTotal(100);// 最大等待毫秒数poolConfig.setMaxWaitMillis(20000);// 使用配置创建连接池JedisPool pool = new JedisPool(poolConfig, "localhost");// 从连接池中获取单个连接Jedis jedis = pool.getResource();// 如果需要密码//jedis.auth("password");

第三步:在 Spring 中使用 Redis

redis只有特定的数据类型,无法操作对象,spring针对这一问题提供了redisTemplate

  • 实现redisTemplate需要依赖的支持
org.springframework.data
spring-data-redis
2.2.3.RELEASE

(1)第一步:使用Spring配置JedisPoolConfig对象

用 Spring 配置一个 JedisPoolConfig 对象

(2)第二步:为连接池配置工厂模型

Spring Data Redis中有四种可供我们选择的工厂模型

  • JredisConnectionFactory
  • JedisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

(3)第三步:配置RedisTemplate

普通的连接没有办法直接将对象直接存入 Redis 内存中,需要将对象序列化(可以简单的理解为继承Serializable接口)。我们可以把对象序列化之后存入Redis缓存中,然后在取出的时候又通过转换器,将序列化之后的对象反序列化回对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6LLlP8w-1579483279541)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg)]

RedisTemplate会找到对应的序列化器去转换Redis的键值:

pojo类实现了serializable接口

(4)第四步:编写测试

@Test    public void test() {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-redis.xml//上一步编写好的配置文件的名字");        RedisTemplate redisTemplate = context.getBean(RedisTemplate.class);        User user = new User();        user.setName("bigbotle");        redisTemplate.opsForValue().set("isMe", user);        User isMe = (User) redisTemplate.opsForValue().get("isMe");        isMe.test();    }}@Dataclass User implements Serializable{    private  String name;     public void test(){         System.out.println("userName:"+name);    }
  • 结果:
    在这里插入图片描述

第四步:在 SpringBoot 中使用 Redis

(1)在SpringBoot中添加Redis依赖:

org.springframework.boot
spring-boot-starter-data-redis
2.2.2.RELEASE

(2)添加配置文件:

在SpringBoot中使用.properties或者.yml都可以

# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

转载地址:http://rofli.baihongyu.com/

你可能感兴趣的文章
(五)Git--分支管理
查看>>
(四)Git--远程仓库
查看>>
(六) Git--标签管理
查看>>
java中继承,子类是否继承父类的构造函数
查看>>
什么是Spring Cloud ?
查看>>
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>