Redis缓存与 Java
来源:互联网 发布:id是什么软件 编辑:程序博客网 时间:2024/05/17 08:11
Redis 和 MongoDB 都是较成熟的NoSQL数据库,但是在高并发的项目中常见做缓存却是Redis 而不是MongoDB 那在这里就要谈一下他们各自的使用场景了
MongoDB 有点类似于Mysql 支持字段索引(MongoDB2.6以后支持了全文索引) 以及游标操作,但MongoDB的数据存储并不是全部在内存;
而Redis 用的C来实现的,支持多种数据结构存储,Redis(3.0之后支持集群)的存储特别的快,官方数据显示在Linux系统读写速度分别可达10万;并且在数据存储中数据全部在内存,并且Redis有自己的策略来保证数据的一致性;
在网上也有很多人说MongoDB是关系型数据库的一种替代;然而却没有人说Redis是关系型数据库的一种替代;也根据他们各自的特点得出
MongoDB 多用于数据存储;Redis 则多用于高并发的缓存
言归正传下边就贴上Redis做缓存的Java代码
1:首先是JAR包 -- 这里用的是Maven做的JAR包管理
在jar包管理中添加了protoStuff 序列化的包,作用就是在反序列化的时候比JDK自带的要更有效率
<!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</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>2:Java 代码 (Seckill 类是一个实体对象)
首先是从Redis中获取数据 这里才获取的时候传入的数据的格式一定要注意一下 |k:v| 并且要转换为字节数组
获取到的值也是字节数组,所以需要反序列化一下
最后返回对象
如果返回的对象为空,那么就需要在service 层进行逻辑控制(存入Redis 缓存)
首先是将Seckill 对象序列化,并设置KEY值
然后设置超时自动维护时间
最后存入Redid中 备以后使用
public class RedisDaoCache {//有点类似连接池的Poolprivate final JedisPool jedisPool;private RuntimeSchema<Seckill> runtimeSchema = RuntimeSchema.createFrom(Seckill.class);public RedisDaoCache(String ip, int port) {jedisPool = new JedisPool(ip, port);}//从缓存获取public Seckill getSeckill(long seckillid) {//Reais缓存 操作逻辑try {//获取链接Jedis jedis = jedisPool.getResource();try {String key = "seckill:" + seckillid;//从redis中拿到的是二进制数组 需要反序列化成Seckillbyte[] bs = jedis.get(key.getBytes());if (bs != null) {//创建空对象Seckill seckill = runtimeSchema.newMessage();//传到空对象 被反序列化ProtostuffIOUtil.mergeFrom(bs, seckill, runtimeSchema);return seckill;}} finally {jedis.close();}} catch (Exception e) {e.printStackTrace();}return null;}//存入缓存public String putSeckill(Seckill seckill) {try {Jedis jedis = jedisPool.getResource();try {//设置keyString key = "seckill:" + seckill.getSeckillid();//序列化byte[] bs = ProtostuffIOUtil.toByteArray(seckill, runtimeSchema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));//存储int timeOut = 60 * 60; //一个小时 超时维护设置时间String succuss = jedis.setex(key.getBytes(), timeOut, bs); //成功返回OKreturn succuss;} finally {jedis.close();}} catch (Exception e) {e.printStackTrace();}return null;}}这里还有一点需要提一下;(假如在进行商品的秒杀)在减完关系型数据库的库存之后还要更改Redis的数据;又因为Redis 的数据是定期的维护;所以建议使用Java常量也来记录库存量;并在减少库存的时候与Readis库存进行比较;这样可以降低数据错误的出现;
期待下一篇的Redis 与 Java
阅读全文
2 0
- Redis缓存与 Java
- memcache缓存与redis缓存
- redis缓存java对象
- java aop redis缓存
- redis 缓存使用 java
- java aop redis缓存
- java中的REDIS缓存
- Java使用Redis缓存
- 如何将 Azure Redis 缓存与 Java 配合使用
- redis-缓存穿透与缓存雪崩
- Redis 缓存与 mysql 数据库
- SpringAOP与Redis搭建缓存
- springMVC与redis事项缓存
- SpringAOP与Redis搭建缓存
- Redis实战与 Session缓存
- Redis-Spring集成与缓存
- SpringAOP与Redis搭建缓存
- Redis缓存应用之Java
- 19个JavaScript常用的简写技术
- 开源爬虫框架各有什么优缺点
- KSGT
- PyCharm 设置运行参数
- 基于VS2013MFC左移显示效果
- Redis缓存与 Java
- Android 微信支付
- 携程--出行产品未来14个月预测
- CSS基本概念
- Hibernate实体命名Bug
- 为什么要分享!?
- locate
- Xen Server 7.0 一直无法退出维护模式
- QGC的mission 航点规划文件示例