项目常见问题思考

在项目中发现:对于首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页静态化。我们今天讨论第一种解决方案。将首页的数据进行缓存。

Redis

redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 、MongoDB等。

Jedis

Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等,推荐使用Jedis。

Spring-data-redis

Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作


Spring Data Redis入门小Demo

准备工作

1.构建Maven工程 SpringDataRedisDemo
2.引入Spring相关依赖、引入JUnit依赖

  <properties><spring.version>4.2.4.RELEASE</spring.version></properties><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version></dependency>

3.引入Jedis和SpringDataRedis依赖

<!-- 缓存 -->
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version>
</dependency>
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version>
</dependency>   

4.在src/main/resources下创建properties文件夹,建立redis-config.properties

redis.host=127.0.0.1
redis.port=6379
redis.pass=
redis.database=0
redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true 

5.在src/main/resources下创建spring文件夹 ,创建applicationContext-redis.xml

   <context:property-placeholder location="classpath*:properties/*.properties" />   <!-- redis 相关配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  <property name="maxIdle" value="${redis.maxIdle}" />   <property name="maxWaitMillis" value="${redis.maxWait}" />  <property name="testOnBorrow" value="${redis.testOnBorrow}" />  </bean>  <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  <property name="connectionFactory" ref="JedisConnectionFactory" />  </bean>  

maxIdle :最大空闲数
maxWaitMillis:连接时的最大等待毫秒数
testOnBorrow:在提取一个jedis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是可用的


对值类型、set、List、Hash类型建立测试类

值类型操作测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestValue {@Autowiredprivate RedisTemplate redisTemplate;@Test//存值public void setValue() {redisTemplate.boundValueOps("name").set("tuzki");}@Test//取值public void getValue() {String str = (String) redisTemplate.boundValueOps("name").get();System.out.println(str);}@Test//移除值public void deleteValue() {redisTemplate.delete("name");}
}

依次测试setValue()和getValue() 后在控制台可以看到:

再测试deleteValue()和getValue() 后在控制台可以看到:

Set类型操作测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestSet {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void setValue() {redisTemplate.boundSetOps("nameset").add("tuzki","tom","刘备","张飞");}@Test//取值public void getValue() {Set set = redisTemplate.boundSetOps("nameset").members();System.out.println(set);}@Test//单独移除set的一个指定元素public void removeValue() {redisTemplate.boundSetOps("nameset").remove("tom");}@Test//整个set元素都移除public void delete() {redisTemplate.delete("nameset");}

依次测试setValue()和getValue() 后在控制台可以看到:

可以看到存入set类型存入和取出值的顺序是不一样的额

List类型操作测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestList {@Autowiredprivate RedisTemplate redisTemplate;@Test/** 右压栈添加元素:取值的顺序和添加进list顺序一致*/public void rightSetValue() {redisTemplate.boundListOps("nameList").rightPush("刘备");redisTemplate.boundListOps("nameList").rightPush("关羽");redisTemplate.boundListOps("nameList").rightPush("张飞");}@Test//显示右压栈的值public void getValue() {List list = redisTemplate.boundListOps("nameList").range(0, 10);//range(start, end):定义起始位置和最后的位置,末位可越界System.out.println(list);}@Test/** 左压栈添加元素:取值的顺序和添加进list顺序相反*/public void leftSetValue() {redisTemplate.boundListOps("nameList2").leftPush("刘备");redisTemplate.boundListOps("nameList2").leftPush("关羽");redisTemplate.boundListOps("nameList2").leftPush("张飞");}@Test//显示左压栈的值public void getValue2() {List list = redisTemplate.boundListOps("nameList2").range(0, 10);//range(start, end):定义起始位置和最后的位置,末位可越界System.out.println(list);}@Test//按照索引位置查询public void searchByIndex() {String str = (String) redisTemplate.boundListOps("nameList2").index(1);System.out.println(str);}@Test//按个数的移除List指定元素public void removeValue() {redisTemplate.boundListOps("nameList").remove(2, "张飞");//remove(i, value): i:移除的个数   value:移除的元素}@Test//移除值public void deleteValue() {redisTemplate.delete("nameList");}

List类型可以根据索引进行相关操作,并且存值的方式有右压栈和左压栈的区别

Hash类型操作测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestHash {@Autowiredprivate RedisTemplate redisTemplate;@Test//存值public void setValue() {redisTemplate.boundHashOps("namehash").put("a", "唐僧");redisTemplate.boundHashOps("namehash").put("b", "悟空");redisTemplate.boundHashOps("namehash").put("c", "八戒");redisTemplate.boundHashOps("namehash").put("d", "沙僧");}@Test//获取所有的keypublic void getKeys() {Set keys = redisTemplate.boundHashOps("namehash").keys();System.out.println(keys);}@Test//获取所有的值public void getValue() {List values = redisTemplate.boundHashOps("namehash").values();System.out.println(values);}@Test//根据键获取值public void searchValueByKey() {String str = (String) redisTemplate.boundHashOps("namehash").get("b");System.out.println(str);}@Test//移除某个小key的值public void removeValue() {redisTemplate.boundHashOps("namehash").delete("c");}

Hash类型的操作则需要注意键值对的关系来操作


项目中的使用

在项目中的service的实现类中使用

先判断从缓存中获取是否有有数据,若没有就先查询数据数据然后再将数据存入缓存,要是缓存中存在需要的数据,则直接使用缓存的数据返回给前端

为了知道获取数据方式,加上了输出语句在控制台输出获取方式的信息;我这里查的是我商城项目首页的商品的分类数据信息

启动服务后,依次打开首页和刷新页面后查看控制输出的信息:

由此可见使用了Spring-Data-Redis后只有第一次访问首页时候才从数据库查询数据,第二次之后访问首页就会从缓存中读取数据

Spring Data Redis简单使用相关推荐

  1. Redis - Spring Data Redis 操作 Jedis 、Lettuce 、 Redisson

    文章目录 官网 Jedis VS Lettuce Jedis Code POM依赖 配置文件 配置类 单元测试 Lettuce Code Redisson Code POM依赖 配置文件 配置类 单元 ...

  2. Spring Boot使用Spring Data Redis操作Redis(单机/集群)

    说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...

  3. Java Spring Data Redis实战与配置参数详解 application.properties...

    Redis作为开源分布式高并发缓存,使用范围非常广泛,主流互联网公司几乎都在使用. Java Spring Boot 2.0实战开发Redis缓存可以参考下面的步骤,Redis安装可以直接使用Linu ...

  4. Spring Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  5. 一文搞定 Spring Data Redis 详解及实战

    转载自  一文搞定 Spring Data Redis 详解及实战 SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问 ...

  6. 使用Spring Data Redis进行缓存

    在下面的示例中,我将向您展示如何使用Spring Data – Redis项目作为Spring 3.1中引入的Spring Cache Abstraction的缓存提供程序. 我对如何使用Spring ...

  7. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  8. Spring Data Redis 实践

    前言 Spring Data Redis是Spring Data大家族的一部分,提供了基于spring应用的简易配置与redis服务访问,它为存储与交互提供了低级(low-level)和高级的(hig ...

  9. Spring Data Redis 让 NoSQL 快如闪电(2)

    2019独角兽企业重金招聘Python工程师标准>>> 把 Redis 当作数据库的用例 现在我们来看看在服务器端 Java 企业版系统中把 Redis 当作数据库的各种用法吧.无论 ...

最新文章

  1. php验证码内置函数,刚写了一个PHP的高效验证码函数 | 学步园
  2. 【教程】TestComplete测试桌面应用程序教程(四)
  3. UNREFERENCED_PARAMETER的作用 (unreferenced formal parameter 警告)
  4. Linux中安装配置hadoop集群
  5. MyBatis之使用JSONObject代替JavaBean优雅返回多表查询结果
  6. Linux下多线程同步方式之互斥量,信号量,条件变量
  7. spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站
  8. jdk 9和jdk8_了解有关JDK9紧凑弦乐的信息(视频评论Charlie Hunt)
  9. openocd目录_OpenOCD的调试
  10. strip(),replace()和re.sub()用法
  11. 连锁餐饮品牌发展战略的节奏要把握好
  12. sha1 java 代码_HMAC-SHA1的java源代码实现
  13. 为什么使用MATLAB的imnoise函数添加高斯噪声时要将方差除以255^2
  14. 上帝视角!美国记者用公开数据,还原川普的全天行动轨迹
  15. BP神经网络的简单应用
  16. 微信小程序中使用iconfont阿里巴巴矢量图标
  17. 黑马程序员新版Linux零基础快速入门到精通——学习笔记
  18. 扩展了 jquery 的插件 easy drag (转载 木野狐)
  19. 浅谈NLM非局部均值滤波
  20. 关于测试工程师进入职场如何规划自己的职业测试生涯。

热门文章

  1. 蓝桥杯2016年第七届真题——四平方和
  2. vs2013编译ffmpeg之七 DeckLink、dxva2
  3. 使用Git和Github来管理自己的代码和笔记
  4. 概率统计领域大牛主页网址
  5. Redis持久化有两种方式:快照持久化(RDB)和AOF
  6. 【Windows】微信截图或看图片偏移
  7. Qt OpenGL(09)在着色器中实现旋转的彩色正方体
  8. 好玩的API调用之---天气预报的API调用与爬虫
  9. 贵州二级计算机考试题库,2018贵州事业单位考试题库:事业单位模拟试卷试题及答案解析六...
  10. 【OpenGL】蓝宝书第十一章——高级着色器应用