redis使用

想起自己以前想把Redis整合到JavaWeb项目中,网上搜了很多教程都不全面,现在我终于弄明白了,所以想在这分享一下。

1.Redis的安装

我这里就不讲了,网上有很多教程,windows,Linux,我自己的是搭建在服务器上的。

图形化连接


向业务逻辑中添加缓存

1.1. 接口封装

常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。

1.1.1. 接口定义

##jedisClient


  
  
  1. package cn.e3mall.common.jedis;
  2. import java.util.List;
  3. public interface JedisClient {
  4. String set(String key, String value);
  5. String get(String key);
  6. Boolean exists(String key);
  7. Long expire(String key, int seconds);
  8. Long ttl(String key);
  9. Long incr(String key);
  10. Long hset(String key, String field, String value);
  11. String hget(String key, String field);
  12. Long hdel(String key, String... field);
  13. Boolean hexists(String key, String field);
  14. List<String> hvals(String key);
  15. Long del(String key);
  16. }

###JedisClientPool


  
  
  1. package cn.e3mall.common.jedis;
  2. import java.util.List;
  3. import redis.clients.jedis.Jedis;
  4. import redis.clients.jedis.JedisPool;
  5. public class JedisClientPool implements JedisClient {
  6. private JedisPool jedisPool;
  7. public JedisPool getJedisPool() {
  8. return jedisPool;
  9. }
  10. public void setJedisPool(JedisPool jedisPool) {
  11. this.jedisPool = jedisPool;
  12. }
  13. @Override
  14. public String set(String key, String value) {
  15. Jedis jedis = jedisPool.getResource();
  16. String result = jedis.set(key, value);
  17. jedis.close();
  18. return result;
  19. }
  20. @Override
  21. public String get(String key) {
  22. Jedis jedis = jedisPool.getResource();
  23. String result = jedis.get(key);
  24. jedis.close();
  25. return result;
  26. }
  27. @Override
  28. public Boolean exists(String key) {
  29. Jedis jedis = jedisPool.getResource();
  30. Boolean result = jedis.exists(key);
  31. jedis.close();
  32. return result;
  33. }
  34. @Override
  35. public Long expire(String key, int seconds) {
  36. Jedis jedis = jedisPool.getResource();
  37. Long result = jedis.expire(key, seconds);
  38. jedis.close();
  39. return result;
  40. }
  41. @Override
  42. public Long ttl(String key) {
  43. Jedis jedis = jedisPool.getResource();
  44. Long result = jedis.ttl(key);
  45. jedis.close();
  46. return result;
  47. }
  48. @Override
  49. public Long incr(String key) {
  50. Jedis jedis = jedisPool.getResource();
  51. Long result = jedis.incr(key);
  52. jedis.close();
  53. return result;
  54. }
  55. @Override
  56. public Long hset(String key, String field, String value) {
  57. Jedis jedis = jedisPool.getResource();
  58. Long result = jedis.hset(key, field, value);
  59. jedis.close();
  60. return result;
  61. }
  62. @Override
  63. public String hget(String key, String field) {
  64. Jedis jedis = jedisPool.getResource();
  65. String result = jedis.hget(key, field);
  66. jedis.close();
  67. return result;
  68. }
  69. @Override
  70. public Long hdel(String key, String... field) {
  71. Jedis jedis = jedisPool.getResource();
  72. Long result = jedis.hdel(key, field);
  73. jedis.close();
  74. return result;
  75. }
  76. @Override
  77. public Boolean hexists(String key, String field) {
  78. Jedis jedis = jedisPool.getResource();
  79. Boolean result = jedis.hexists(key, field);
  80. jedis.close();
  81. return result;
  82. }
  83. @Override
  84. public List<String> hvals(String key) {
  85. Jedis jedis = jedisPool.getResource();
  86. List<String> result = jedis.hvals(key);
  87. jedis.close();
  88. return result;
  89. }
  90. @Override
  91. public Long del(String key) {
  92. Jedis jedis = jedisPool.getResource();
  93. Long result = jedis.del(key);
  94. jedis.close();
  95. return result;
  96. }
  97. }

###JedisClientCluster


  
  
  1. package cn.e3mall.common.jedis;
  2. import java.util.List;
  3. import redis.clients.jedis.JedisCluster;
  4. public class JedisClientCluster implements JedisClient {
  5. private JedisCluster jedisCluster;
  6. public JedisCluster getJedisCluster() {
  7. return jedisCluster;
  8. }
  9. public void setJedisCluster(JedisCluster jedisCluster) {
  10. this.jedisCluster = jedisCluster;
  11. }
  12. @Override
  13. public String set(String key, String value) {
  14. return jedisCluster.set(key, value);
  15. }
  16. @Override
  17. public String get(String key) {
  18. return jedisCluster.get(key);
  19. }
  20. @Override
  21. public Boolean exists(String key) {
  22. return jedisCluster.exists(key);
  23. }
  24. @Override
  25. public Long expire(String key, int seconds) {
  26. return jedisCluster.expire(key, seconds);
  27. }
  28. @Override
  29. public Long ttl(String key) {
  30. return jedisCluster.ttl(key);
  31. }
  32. @Override
  33. public Long incr(String key) {
  34. return jedisCluster.incr(key);
  35. }
  36. @Override
  37. public Long hset(String key, String field, String value) {
  38. return jedisCluster.hset(key, field, value);
  39. }
  40. @Override
  41. public String hget(String key, String field) {
  42. return jedisCluster.hget(key, field);
  43. }
  44. @Override
  45. public Long hdel(String key, String... field) {
  46. return jedisCluster.hdel(key, field);
  47. }
  48. @Override
  49. public Boolean hexists(String key, String field) {
  50. return jedisCluster.hexists(key, field);
  51. }
  52. @Override
  53. public List<String> hvals(String key) {
  54. return jedisCluster.hvals(key);
  55. }
  56. @Override
  57. public Long del(String key) {
  58. return jedisCluster.del(key);
  59. }
  60. }

配置:applicationContext-redis.xml


  
  
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <beans xmlns= "http://www.springframework.org/schema/beans"
  3. xmlns:context= "http://www.springframework.org/schema/context" xmlns:p= "http://www.springframework.org/schema/p"
  4. xmlns:aop= "http://www.springframework.org/schema/aop" xmlns:tx= "http://www.springframework.org/schema/tx"
  5. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
  8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
  9. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
  10. <!-- 连接redis单机版 -->
  11. <bean id= "jedisClientPool" class= "cn.e3mall.common.jedis.JedisClientPool">
  12. <property name= "jedisPool" ref= "jedisPool"></property>
  13. </bean>
  14. <bean id= "jedisPool" class= "redis.clients.jedis.JedisPool">
  15. <constructor-arg name= "host" value= "115.159.126.205"/>
  16. <constructor-arg name= "port" value= "6379"/>
  17. </bean>
  18. <!-- 连接redis集群 -->
  19. <!-- <bean id= "jedisClientCluster" class= "cn.e3mall.common.jedis.JedisClientCluster">
  20. <property name= "jedisCluster" ref= "jedisCluster"/>
  21. </bean>
  22. <bean id= "jedisCluster" class= "redis.clients.jedis.JedisCluster">
  23. <constructor-arg name= "nodes">
  24. <set>
  25. <bean class= "redis.clients.jedis.HostAndPort">
  26. <constructor-arg name= "host" value= "192.168.25.162"></constructor-arg>
  27. <constructor-arg name= "port" value= "7001"></constructor-arg>
  28. </bean>
  29. <bean class= "redis.clients.jedis.HostAndPort">
  30. <constructor-arg name= "host" value= "192.168.25.162"></constructor-arg>
  31. <constructor-arg name= "port" value= "7002"></constructor-arg>
  32. </bean>
  33. <bean class= "redis.clients.jedis.HostAndPort">
  34. <constructor-arg name= "host" value= "192.168.25.162"></constructor-arg>
  35. <constructor-arg name= "port" value= "7003"></constructor-arg>
  36. </bean>
  37. <bean class= "redis.clients.jedis.HostAndPort">
  38. <constructor-arg name= "host" value= "192.168.25.162"></constructor-arg>
  39. <constructor-arg name= "port" value= "7004"></constructor-arg>
  40. </bean>
  41. <bean class= "redis.clients.jedis.HostAndPort">
  42. <constructor-arg name= "host" value= "192.168.25.162"></constructor-arg>
  43. <constructor-arg name= "port" value= "7005"></constructor-arg>
  44. </bean>
  45. <bean class= "redis.clients.jedis.HostAndPort">
  46. <constructor-arg name= "host" value= "192.168.25.162"></constructor-arg>
  47. <constructor-arg name= "port" value= "7006"></constructor-arg>
  48. </bean>
  49. </set>
  50. </constructor-arg>
  51. </bean> -->
  52. </beans>

 封装代码测试


  
  
  1. @Test
  2. public void testJedisClient() throws Exception {
  3. //初始化Spring容器
  4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:spring/applicationContext-redis.xml");
  5. //从容器中获得JedisClient对象
  6. JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
  7. jedisClient.set( "first", "100");
  8. String result = jedisClient.get( "first");
  9. System.out.println(result);
  10. }

添加缓存

1.1.1. 功能分析

查询内容列表时添加缓存。

1、查询数据库之前先查询缓存。

2、查询到结果,直接响应结果。

3、查询不到,缓存中没有需要查询数据库。

4、把查询结果添加到缓存中。

5、返回结果。


  
  
  1. 向redis中添加缓存:
  2. Key:cid
  3. Value:内容列表。需要把java对象转换成json。
  4. 使用hash对key进行归类。
  5. HASH_KEY:HASH
  6. |--KEY:VALUE
  7. |--KEY:VALUE
  8. |--KEY:VALUE
  9. |--KEY:VALUE

注意:添加缓存不能影响正常业务逻辑。

代码实现(在服务层实现)


  
  
  1. @Autowired
  2. private JedisClient jedisClient;

  
  
  1. @Value( "${CONTENT_LIST}")
  2. private String CONTENT_LIST;
  3. @Override
  4. public E3Result addContent(TbContent content) {
  5. //将内容数据插入到内容表
  6. content.setCreated( new Date());
  7. content.setUpdated( new Date());
  8. //插入到数据库
  9. contentMapper.insert(content);
  10. //缓存同步,删除缓存中对应的数据。
  11. jedisClient.hdel(CONTENT_LIST, content.getCategoryId().toString());
  12. return E3Result.ok();
  13. }

  
  
  1. @Override
  2. public List<TbContent> getContentListByCid(long cid) {
  3. //查询缓存
  4. try {
  5. //如果缓存中有直接响应结果
  6. String json = jedisClient.hget(CONTENT_LIST, cid + "");
  7. if (StringUtils.isNotBlank(json)) {
  8. List<TbContent> list = JsonUtils.jsonToList(json,TbContent.class);
  9. System.out.println( "从缓存中查出的数据");
  10. return list;
  11. }
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. //如果没有查询数据库
  16. TbContentExample example = new TbContentExample();
  17. Criteria criteria = example.createCriteria();
  18. //设置查询条件
  19. criteria.andCategoryIdEqualTo(cid);
  20. //执行查询
  21. List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);
  22. //把结果添加到缓存
  23. try {
  24. System.out.println( "把结果添加到缓存");
  25. jedisClient.hset(CONTENT_LIST, cid + "", JsonUtils.objectToJson(list));
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. return list;
  30. }

**注意要实现缓存同步


再讲一个东西,热缓存,给它设一个过期时间(不同步也是可以的)


  
  
  1. @Override
  2. public TbItem getItemById(long itemId) {
  3. //获取商品添加缓存,不影业务响逻辑,try-catch
  4. try {
  5. System.out.println( "缓存获取商品信息");
  6. String json = jedisClient.get(REDIS_ITEM_PRE+ ":"+itemId+ ":BASE");
  7. if(StringUtils.isNotBlank(json)) {
  8. TbItem tbItem = JsonUtils.jsonToPojo(json,TbItem.class);
  9. return tbItem;
  10. }
  11. } catch(Exception e) {
  12. e.printStackTrace();
  13. }
  14. //缓存中没有,查询数据库
  15. //根据主键查询
  16. //TbItem tbItem = itemMapper.selectByPrimaryKey(itemId);
  17. TbItemExample example = new TbItemExample();
  18. Criteria criteria = example.createCriteria();
  19. //设置查询条件
  20. criteria.andIdEqualTo(itemId);
  21. //执行查询
  22. List<TbItem> list = itemMapper.selectByExample(example);
  23. if (list != null && list.size() > 0) {
  24. //结果添加到缓存
  25. try {
  26. System.out.println( "缓存添加商品信息");
  27. jedisClient.set(REDIS_ITEM_PRE+ ":"+itemId+ ":BASE",JsonUtils.objectToJson(list.get( 0)));
  28. //设置过期时间(1个小时)
  29. jedisClient.expire(REDIS_ITEM_PRE+ ":"+itemId+ ":BASE",TIEM_CACHE_EXPIRE);
  30. } catch(Exception e) {
  31. e.printStackTrace();
  32. }
  33. return list.get( 0);
  34. }
  35. return null;
  36. }


redis中的数据:

{"itemId":1231490,"created":1425821627000,"updated":1425821627000,"itemDesc":"<table cellpadding=\"0\" cellspacing=\"0\" align=\"center\" border=\"0\" width=\"750\">  <tbody>    <tr>      <td height=\"51\" width=\"750\"><div style=\"PADDING-BOTTOM: 15px; LINE-HEIGHT: 1.5em; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; FONT-FAMILY: '微软雅黑'; FONT-SIZE: 15px; PADDING-TOP: 15px\"><span style=\"color:#ff6666;\"><strong>温馨提示:</strong></span><strong>小米4联通版</strong>内置运营商软件,<strong>小米4官方联通版</strong>是无内置运营商软件的。</div></td>    </tr>  </tbody></table><div class=\"content_tpl\">    <div class=\"formwork_bt\" id=\"detail-tag-id-0\" name=\"detail-tag-id-0\" text=\"产品展示\">   <div class=\"formwork_bt_dz\">    <span>产品展示</span>    <span class=\"s2\">Products Exhibition</span>   </div>  </div> <table cellpadding=\"0\" cellspacing=\"6\" align=\"center\" border=\"0\" width=\"750\">  <tbody><tr>    <td><img src=\"http://img30.360buyimg.com/jgsq-productsoa/jfs/t346/347/1422821621/45195/e22eac9b/5439038bNa168d543.jpg\" alt=\"\" /></td>    <td><p class=\"formwork_titleleft\">小米手机4</p><p class=\"formwork_titleleft2\">依然出色性能用智能手机阅读、拍照、游戏甚至完成复杂艰巨的任务,这一切都依赖于快。每一代小米手机,都使用了当前先进的元器件。更快的处理器、更快的闪存、更快的相机和图像处理,支持更快的网络。集世界全新科技在一部5英寸大小的设备,只为让科技乐趣人人都可享用,生活正因此变得更加美好</p></td>  </tr></tbody></table>    <div class=\"formwork_bt\" id=\"detail-tag-id-2\" name=\"detail-tag-id-2\" text=\"产品信息\">   <div class=\"formwork_bt_dz\">    <span>产品信息</span>    <span class=\"s2\">Product Information</span>   </div>  </div> <div class=\"formwork\"><div class=\"formwork_titlecenter\">Qualcomm&reg; 骁龙? 801四核2.5GHz 处理器</div><div class=\"formwork_text\">高端手机处理器性能之王小米手机 4 采用了高通动力十足的骁龙801手机处理器,内含四个Krait 400 2.5GHz 处理核心。运算速度提升14%,性能更强大。它能出色地同时处理多个复杂任务。它的强大还体现在图像处理器速度较前代提升近一倍,这让拍照与录像都有了更多玩法和可能性。内含一个 Hexagon DSP 核心,专门以超低功耗运行电影、音乐、拍照等任务。这意味着在性能更强大的同时,手机续航都比以往更加持久耐用。</div></div><div class=\"formwork\"><div class=\"formwork_img\"><img src=\"http://img20.360buyimg.com/vc/jfs/t307/358/1403468763/249668/b4048162/54388804Na68f8ead.png\" alt=\"\" /></div></div><div class=\"formwork\"><div class=\"formwork_titlecenter\">Adreno 330 图形处理器</div><div class=\"formwork_text\">游戏机品质的3D渲染能力Adreno 330 图形处理器支持高级图形处理API,包括OpenGL ES 3.0、OpenCL、RenderscriptCompute和FlexRender 。它之所以能够快速渲染复杂的图形,得益于统一渲染架构及FlexRender 快速渲染技术。统一渲染架构能够根据所渲染的图形类型,动态调整其资源分配方式,像素和顶点渲染均可进行独立调节。FlexRender 技术可以直接或通过延迟渲染模式在图形像素间动态转换,从而帮助Adreno GPU更快速、更高效地渲染游戏图形。</div></div><div class=\"formwork\"><div class=\"formwork_img\"><img src=\"http://img20.360buyimg.com/vc/jfs/t352/350/1359939860/199186/e31d4b62/5438882fN8a00b5ac.png\" alt=\"\" /></div></div><div class=\"formwork\"><div class=\"formwork_titlecenter\">高色饱和度屏,84% NTSC色域</div><div class=\"formwork_text\">鲜艳度比 iPhone 5s 高17%小米手机4 采用了高色彩饱和度夏普/JDI屏幕,整体的色彩饱和度提升17%,令色彩表现力更加丰富。无论在小米手机4上面浏览图片、观看视频,或是使用精彩的App,都能为你呈现逼真的颜色效果。</div></div><div class=\"formwork\"><div class=\"formwork_img\"><img src=\"http://img20.360buyimg.com/vc/jfs/t292/303/1377649814/236958/cf633089/54388856N6b7e3293.png\" alt=\"\" /></div></div><table cellpadding=\"0\" cellspacing=\"6\" align=\"center\" border=\"0\" width=\"750\">  <tbody><tr>    <td><img src=\"http://img20.360buyimg.com/vc/jfs/t337/149/1399837173/112733/5916cfcd/54388886Neddc8729.png\" alt=\"\" /></td>    <td><p class=\"formwork_titleleft\">索尼高画质</p><p class=\"formwork_titleleft2\">最快0.3秒极速对焦如何用手机拍下转瞬即逝的美好瞬间?采用索尼 IMX 214 第二代 1300 万像素 Exmor RS? 堆栈式图像传感器,通过减少片上微透镜与感光二极管的距离,使其更容易集合光线。支持硬件更丰富、噪点更少的照片。6片镜头组采用了闭环式对焦技术,对焦最快至0.3秒,这比主流手机都快了两倍之多。它还具备手机上最大的F1.8大光圈,暗光更出色,背景虚化效果更加柔美。为了让拍摄具备更多便利和趣味,还可以使用魔术对焦功能,先拍照,回看时再选择焦点。不必苦练摄影技能,却可以用小米手机4拍出动人有趣的照片</p></td>  </tr></tbody></table><div class=\"formwork\"><div class=\"formwork_titlecenter\">支持最新4G LTE网络</div><div class=\"formwork_text\">用更快的方式上网、听音乐、看视频移动4G版支持最新中国移动4G(TDD-LTE)网络,下行峰值速率最高可达到132Mbps,上传的速度可达31Mbps。如此之快的传输速度几乎可满足对于无线应用的任何需要。当你外出旅行时,你可以用它随时随地观看在线高清视频,浏览网页或玩最流行的在线游戏,极速的4G网络速度可以带给你酣畅淋漓的使用体验。另可选购联通3G及电信3G版本。</div></div><div class=\"formwork\"><div class=\"formwork_img\"><img src=\"http://img20.360buyimg.com/vc/jfs/t322/260/1373090020/189626/610b2da/543888a1Ncd81c157.png\" alt=\"\" /></div></div><div class=\"formwork\"><div class=\"formwork_titlecenter\">用手机遥控电视、空调</div><div class=\"formwork_text\">配备红外发射器,支持2853款设备小米手机4 内置红外遥控功能,支持与红外接受设备的传输协议,可以通过专门为这一功能定制的小米遥控器App,遥控家里电视、空调等支持红外协议的家用电器。目前已支持2853款设备,更多设备不断更</div></div><div class=\"formwork\"><div class=\"formwork_img\"><img src=\"http://img20.360buyimg.com/vc/jfs/t343/265/1372124071/66786/5ee90d6e/543888d1N3d0c4330.png\" alt=\"\" /></div></div><div class=\"formwork\"><div class=\"formwork_titlecenter\">MIUI V5</div><div class=\"formwork_text\">全球24种语言版本,6500万用户好评如潮MIUI 针对原生 Android 深入系统底层优化,更流畅也更加省电。其次是好看,上千款原创主题,上万种搭配,让手机界面千变万化。更重要的是,它让你的生活更加方便。自动识别陌生电话,识别骚扰、诈骗电话。它还可以迅速找到你需要的生活服务,就连预约餐馆和医院挂号也能在系统中完成。</div></div><div class=\"formwork\"><div class=\"formwork_img\"><img src=\"http://img20.360buyimg.com/vc/jfs/t298/277/1374037756/194959/d1e9ee70/543888f1Na55c4785.png\" alt=\"\" /></div></div></div>"}
  
  
{"id":1231490,"title":"小米4 白色 联通3G手机","sellPoint":"卖完下柜!不锈钢金属边框,5英寸屏超窄边,骁龙四核2.5GHz处理器,3G RAM,1300W+800W摄像头!","price":199900,"num":99999,"barcode":null,"image":"https://g-search3.alicdn.com/img/bao/uploaded/i4/i3/TB1fyILc_mWBKNjSZFBXXXxUFXa.jpg_180x180.jpg_.webp","cid":560,"status":1,"created":1425821627000,"updated":1425821627000}
  
  



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值