简单的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数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...
随机推荐
- 抓取分析网页批量下载评书(3)之批量下载mp3
本系列目录: <1.搜索有声小说> <2.分析详细页地址> <3.批量下载mp3> 本篇是大结局,看过前两篇的放心吧,不会有 ...
- cas未能够识别出目标 ***;票根
使用cas做单点登录,在验证ticket的时候,报下面的错误: <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> & ...
- jspm 简介
借鉴:http://www.jianshu.com/p/4aba847b3e8c 功能 1. 支持加载JavaScript各种模块化的写法:AMD.CommonJS.标准化的ES6模块... 2. 包 ...
- eclipse maven打war包
在eclipse中找到pom.xml文件右键 选择debug as 再选择Maven install运行后 按路径找到生成的war包 推荐https://www.cnblogs.com/qlqwjy/ ...
- iOS开发-仿微信图片分享界面实现
分享功能目前几乎已成为很多app的标配了,其中微信,微博等app的图片分享界面设计的很棒,不仅能够展示缩略图,还可以预览删除.最近我在做一款社交分享app,其中就要实现图文分享功能,于是试着自行实现仿 ...
- php5.3新垃圾回收机制详解
php的垃圾回收机制主要参考了http://blog.csdn.net/phpkernel/article/details/5734743 这文章. 变量对应的值,比如 $a="abc&qu ...
- 安卓APP简单后端的搭建
写在前面: 此教程没有用到后端框架.只是单纯用servlet做一个例子,如果是学框架可以不用往下看了 本文适合哪些人:懂java的,会写android单机程序,懂得用HTTPClient等发送请求解析 ...
- Ubuntu系统的安装(虚拟机) 并配置C/C++编译器
一.系统的初始化配置 1.配置静态IP和DNS 配置静态IP 1.sudo vim /etc/network/interfaces,修改文件内容如下: auto eth0 #表示让网卡开机自动挂载e ...
- ORA-01113 & ORA-01110同时出现
\NOARCHIVED LOG , 没备份 , Redo Log 被覆盖 , 某个datafile不能online 设计知识点:BBED> set block 1BBED> p kcvfh ...
- docker学习实践之路[第四站]利用pm2镜像部署node应用
拉取keymetrics/pm2-docker-alpine:8镜像 docker pull keymetrics/pm2-docker-alpine: [8]为node镜像的版本号: 建立Docke ...