Redis(2)用jedis实现在java中使用redis
昨天已经在windows环境下安装使用了redis。
下面准备在java项目中测试使用redis。
redis官网推荐使用jedis来访问redis。所以首先准备了jedis的jar包,以及需要依赖的jar包。
commons-pool2-2.3
hamcrest-core-1.3
jedis-2.7.2.jar
因为redis也是属于一种数据库,也是对数据的访问,所以把他放置在dao层,与service分开
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtostuffIOUtil; import com.dyuproject.protostuff.runtime.RuntimeSchema; import com.xhxkj.ssm.entity.UserEntity; /** * 访问redis数据层 * @author XX * */ public class RedisDao { private final JedisPool jedisPool;//redis连接池 /** * 构造方法 * @param ip 访问的ip * @param port 访问的端口 */ public RedisDao(String ip, int port) { jedisPool = new JedisPool(ip,port); } //创建一个schema用来序列化 private RuntimeSchema<UserEntity> schema = RuntimeSchema.createFrom(UserEntity.class); /** * 通过用户名获取redis中对应的用户信息 * @param username 输入的用户名 * @return 存在返回:这个对象,不存在返回:null */ public UserEntity getUser(String username) { //redis操作 try{ Jedis jedis = jedisPool.getResource(); try { //在redis中存放时,key的书写规则,官方推荐,对象:对象属性 //也就是获取时利用“user:username”作为键来得到值 String key = "user:" + username; //自定义序列化 //在redis中获取的值一定是一个字节数组,需要通过反序列化转换成java对象 byte[] bytes = jedis.get(key.getBytes()); if(bytes != null) { //获取一个空对象 UserEntity user = schema.newMessage(); //反序列化后放置在user中 ProtostuffIOUtil.mergeFrom(bytes, user, schema); return user; } }finally{ jedis.close(); } }catch (Exception e){ e.printStackTrace(); } return null; } /** * 在缓存中存放user对象 * @param user * @return 成功返回“OK”;失败返回错误信息 */ public String putUser(UserEntity user) { try { Jedis jedis = jedisPool.getResource(); try { //通过对应的键存放user对象 String key = "user:" + user.getUsername(); //自定义序列化操作,利用protostuff将对象序列化成字节数组 byte[] bytes = ProtostuffIOUtil.toByteArray(user, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); //缓存时间1小时,缓存的时间是用秒来计的 int timeout = 60*60; //在redis中存放这个对象 return jedis.setex(key.getBytes(),timeout,bytes); } finally{ jedis.close(); } } catch (Exception e) { e.printStackTrace(); } return null; } }
这里提供了两个方法,分别是put和get,其中需要用到序列化和反序列化的操作,用到的jar包有下面这几个
protostuff-core-1.0.8.jar
protostuff-runtime-1.0.8.jar
protostuff-collectionschema-1.0.8.jar
protostuff-api-1.0.8.jar
protostuff属于性能相当优秀的一种
在spring中配置
<!-- redisDao -->
<bean id="redisDao" class="com.xxx.dao.redis.RedisDao">
<constructor-arg index="0" value="localhost"/>
<constructor-arg index="1" value="6379"/>
</bean>
之后就可以直接在服务层调用redisDao的方法了
//首先去redis中寻找是否存在缓存的用户信息
UserEntity resultUser = redisDao.getUser("xx");
//如果不存在,那就在缓存中放置一个用户信息
if(resultUser == null)
{
String result = redisDao.putUser(user);
System.out.println(result);
return null;
}
else
{
return resultUser;
}
需要注意的是,如果存放成功,返回是一个字符串“OK”
在使用前一定要确定你的redis服务处于开启状态,cmd窗口是开着的
因为网络上面很多都是用maven配置的,所以jar包比较难找,jar包间的依赖确实比较麻烦,推荐一个网站http://maven.outofmemory.cn/
这个网站能很好的找到各种jar包,并且告诉你依赖的关系,非常方便
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?