简单的redis缓存操作(get、put)
简单的redis缓存操作(get、put)
本文介绍简单的redis缓存操作,包括引入jedisjar包、配置redis、RedisDao需要的一些工具、向redis中放数据(put)、从redis中取数据(get)、访问redis时的逻辑
一、引入jedis jar包
<!-- java访问redis的jar包jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<!-- protostuff序列化依赖 -->
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>
注意:为什么要引入序列化依赖jar包protostuff?
1)从redis中取出的数据是序列化的,我们需要使用protostuff的反序列化操作,将序列化对象转化成我们的需要的对象
2)向redis中放入数据时,我们需要先使用protostuff的序列化操作,将对象转化成序列化对象,才能放入redis
二、在spring配置文件中注入redis,放入spring的ioc容器
<!-- 注入redis dao -->
<bean id="redisDao" class="org.demo.dao.cache.RedisDao">
<constructor-arg index="0" value="localhost"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
注意:
1)这里的RedisDao路径是我的包路径,注意你在配置的时候应使用你自己的路径
2)这里使用本地的redis服务localhost
3)redis服务的默认端口是6379
三、RedisDao需要的一些工具
//redis连接池
private final JedisPool jedisPool;//根据对象的字节码文件,生成空对象
private RuntimeSchema<Object> schema = RuntimeSchema.createFrom(Object.class); //Object.class:获取对象的字节码 public RedisDao(String ip, int port){
jedisPool = new JedisPool(ip, port);
}
注意:
1)RedisDao需要redis的连接池JedisPool,就好比JDBC的数据库连接池一样。我们在RedisDao的构造器中会初始化这个连接池
2)我们需要一个可以根据对象的字节码文件生成空对象的工具 RuntimeSchema。你要使用什么对象,你就在Object的位置写入你的对象(Object.class:获取对象的字节码文件)
3)连接池JedisPool的初始化需要两个参数:ip、port
四、向redis中放数据(put)
//将对象缓存到redis
public String putObject(Object obj){
//缓存逻辑:Object --> 序列化 --> byte[] --> 缓存到redis
try {
Jedis jedis = jedisPool.getResource(); //获取redis的连接对象,相当于JDBC的connection
try{
String key = "Object:"+obj.getId();
//进行序列化
byte[] bytes = ProtostuffIOUtil.toByteArray(obj, schema,
LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); //如果对象过大,会进行缓冲
//开始缓存
int timeout = 60*60; //设置超时时间 一小时,通过超时维护一致性
String result = jedis.setex(key.getBytes(), timeout, bytes);
return result;
}finally{
jedis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
注意:
1)缓存逻辑:Object --> 序列化操作 --> byte[] --> 写入redis。也就是先把对象序列化,再写入redis!
2)我们在操作redis之前必须先拿到redis的连接对象,从连接池拿
五、从redis中取数据(get)
//从redis缓存中查询
public Object getObject(long id){
//redis操作逻辑
try {
Jedis jedis = jedisPool.getResource(); //缓存连接对象,相当于数据库连接对象connection
try {
String key = "Object:"+id;
//实体对象并没有实现内部序列化操作
//缓存逻辑:getByte[] --> 反序列化 --> Object
byte[] bytes = jedis.get(key.getBytes()); //从jedis中获取目标对象的序列化对象数组
if(bytes != null){
//反序列化逻辑
Object obj = schema.newMessage(); //通过schema生成一个新的空对象
ProtostuffIOUtil.mergeFrom(bytes, obj, schema); //进行反序列化操作
return obj;
} } finally {
jedis.close();
} } catch (Exception e) {
e.printStackTrace();
}
return null;
}
注意:
1)取数据逻辑:redis --> 得到byte[] --> 反序列化 --> Object
2)我们在放数据的时候,是以键值对的形式:id --> obj。我们在取数据的时候,就是根据id来取的
六、查询redis时的逻辑
伪代码:
get form redis_cache //首先查询redis
if null //如果没有
get from db //再从数据库db查询
if null //如果仍然没有
return null //那么返回空
else //否则
put into redis_cache //现将数据放入redis
return obj //再放回数据
else //如果从redis中查询到了
return obj //那么直接返回数据
简单的redis缓存操作(get、put)的更多相关文章
- 封装php redis缓存操作类
封装php redis缓存操作类,集成了连接redis并判断连接是否成功,redis数据库选择,检测redis键是否存在,获取值,写入值,设置生存时间和删除清空操作. php redis类代码: &l ...
- SpringBoot使用@Cacheable实现最简单的Redis缓存
前言 之前我们使用过RedisTemplate来实现redis缓存,然后使用工具类来实现操作redis的存储.这样的方式好处是很自由,但是还不是最简单的处理方式.对于一些简单的应用来说,其实redis ...
- redis(四)--简单实现Redis缓存中的排序功能
在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发的应 ...
- 简单实现Redis缓存中的排序功能
1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发 ...
- thinkphp5简单使用redis缓存
<?php namespace app\index\controller; use think\Controller; use think\Cache\Driver\Redis; class I ...
- spring-boot的spring-cache中的扩展redis缓存的ttl和key名
原文地址:spring-boot的spring-cache中的扩展redis缓存的ttl和key名 前提 spring-cache大家都用过,其中使用redis-cache大家也用过,至于如何使用怎么 ...
- redis缓存和mysql数据库同步
附redis关于缓存雪崩和缓存穿透,热点key 穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法: 持久层查询不到就缓存空结果,查询时先判断缓存 ...
- .net使用CSRedis操作Redis缓存的简单笔记(新手教程)
0.介绍 .NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Include ...
- 基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)
目录 1 准备工作 2 具体实施 1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...
随机推荐
- DataGrid列表信息保存为EXCEL到指定的路径 ---------继续DataGrid在WPF的数据绑定
一.许多WPF或者Winform程序在保存数据时,会以EXCEL或者文本的形式展现可视化界面的数据,本文就简单介绍下将DataGrid列表信息保存为EXCEL到指定的路径下,例子很简单,用的着的直接用 ...
- PHP进行数据库操作时遇到的一个问题
PHP进行数据库操作时遇到的一个问题 昨天在进行数据库操作时,遇到了一个问题(用的是 wampserver 环境): <?php $link = @mysqli_connect('localho ...
- HTML元素ID和JS方法名重复,JS调用失败
HTML元素ID和JS方法名重复时,JS中的重名方法无法被找到,不能执行. 修改ID或者方法名,两者不一致即可.
- mybatis四大接口之 StatementHandler
1. 继承结构 StatementHandler:顶层接口 BaseStatementHandler : 实现顶层接口的抽象类,实现了部分接口,并定义了一个抽象方法 SimpleStatementHa ...
- Spring中ioc的实现原理
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 1-1 Vue的介绍
简单介绍Vue Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易 ...
- oracle 闪回、归档的设置建议
闪回与归档的相关测试 参考博客:http://www.cnblogs.com/hellojesson/p/7050097.html 数据库在归档模式下的管理 参考博客:http://www.cnblo ...
- ActiveMq使用笔记
java JMS技术 .1. 什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用 ...
- JDK提供的四种线程池代码详解
一.线程池什么时候使用,会给我们带来什么好处? 如果很多用户去访问服务器,用户访问服务器的时间是非常短暂的,那么有可能在创建线程和销毁线程上花费的时间会远远大于访问所消耗的时间,如果采用线程池会使线程 ...
- Hadoop不适合处理实时数据的原因剖析
1.概述 Hadoop已被公认为大数据分析领域无可争辩的王者,它专注与批处理.这种模型对许多情形(比如:为网页建立索引)已经足够,但还存在其他一些使用模型,它们需要来自高度动态的来源的实时信息.为了解 ...