简单的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数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...
随机推荐
- supervisor错误记录
今天在使用supervisor配置多个程序时遇到了问题如下 FATAL Exited too quickly (process log may have details) 然后就找到了日志文件 ...
- Python地理位置信息库geopy的使用(一):基本使用
geopy是Python关于地理位置的一个第三方库,用这个库来进行地址位置信息的查询和转换非常方便,本文介绍关于geopy的常用的几种用法 geopy的安装 pip install geopy 根据地 ...
- 配置文件springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 79 Solved: 58[Sub ...
- XSS 跨站脚本攻击 的防御解决方案
虽然说在某些特殊情况下依然可能会产生XSS,但是如果严格按照此解决方案则能避免大部分XSS攻击. 原则:宁死也不让数据变成可执行的代码,不信任任何用户的数据,严格区数据和代码. XSS的演示 Exam ...
- 修改tomcat默认端口号
修改tomcat端口号 端口修改tomcat tomcat服务器的默认端口号是8080 1 只启动一个tomcat的情况 当我们不想使用8080端口,需要修改为其他端口时,我们可以: 1, 打开tom ...
- zabbix 监控安装
注意:此篇是在安装好lnmp环境后才能部署的操作,所以,做之前准备好lnmp环境,或者可以参考我做的lnmp环境,之后接着此篇开始安装 监控系统Zabbix-3.2.1的安装 zabbix-serve ...
- Java中的日志管理
日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java. ...
- js便签笔记(9)——解读jquery源码时记录的一些知识点
近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...
- git 删除远程分支文件夹
把不需要版本控制的文件提交到远程分支上后,需要删除远程分支上的文件,用以下操作即可: git rm -r –cached dirname //删除远程文件夹,但保留本地文件夹 git commit - ...