数据缓存技术 SpringDataRedis
项目思考
- 由于高并发 数据访问量过大对于数据库服务器造成访问压力过大,防止服务端崩溃。因此产生的两种优化方式,
- 第一种 : 数据缓存技术,用到的技术点就是-springDataRedis
- 第二种 : 网页静态化技术, Freemarker
两种缓存技术区别
- springDataRedis 针对数据量小,但是变化比较多的情况,因为基于是内存,所以存储空间有限。例如电商项目中秒杀单品,轮播图,或者p2p项目的招标 投标的内容。。
- freemarker 技术是本地数据保存,针对的数据量大,但是不经常的变化的场景。例如新闻详情页,商品详情页..
redis同memecache 区别?
- 关注数据持久化和主从复制时,redis使用率更高。
- key-value这样简单的数据储存,memcache的内存使用率更高;采用hash结构,redis的内存使用率会更高,redis支持的数据类型更加丰富
- memecache 把数据全部存在内存之中,redis实现了部分持久化,memecache一断电就数据就会全部丢失
1. redis
- 以key-value形式存在的数据库技术,运行于内存中,相似的技术还有memcache、memcached 、MongoDB
2. Jedis
- 官方推荐的面向redis的客户端框架,内部提供了大量的API可以供其调用
3. springDataRedis介绍
- 通过在spring中进行部分配置,就可以访问redis服务,并且springDataRedis内部对于包(Jedis, JRedis,andRJC)底层开发工具进行封装,通过RedisTemplate 实现对于redis数据库CRUD 。 并且将同一类型操作封装为 operation 接口
- ValueOperations:简单 K-V 操作
- SetOperations:set 类型数据操作
- ZSetOperations:zset 类型数据操作
- HashOperations:针对 map 类型的数据操作
- ListOperations:针对 list 类型的数据操作
springdataredis 实现原理,底层封装介绍
springdataredis 入门Demo
- 1 添加依赖
<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>
- 2 配置properties文件
# Redis settings # server IP redis.host=127.0.0.1 # server port redis.port=6379 # server pass redis.pass= # use dbIndex redis.database=0 # 最大空闲数 redis.maxIdle=300 #连接时的最大等待毫秒数 redis.maxWait=3000 #在提取一个 jedis 实例时,是否提前进行验证操作;如果为 true,则得到的 jedis 实例均是可用的; redis.testOnBorrow=true
* 3 在springmvc配置,JedisPoolConfig,JedisConnectionFactory,RedisTemplate
<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>
Hash 类型操作
package com.ruirui; import java.util.List; import java.util.Set; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.BoundValueOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml") public class Demo { @Autowired private RedisTemplate redisTemplate; @Test public void setValue(){ redisTemplate.boundHashOps("namehash").put("a", "1"); redisTemplate.boundHashOps("namehash").put("b", "1"); redisTemplate.boundHashOps("namehash").put("c", "1"); redisTemplate.boundHashOps("namehash").put("d", "1"); } @Test public void testGetKeys(){ Set s = redisTemplate.boundHashOps("namehash").keys(); System.out.println(s); } @Test public void testGetValues(){ List values = redisTemplate.boundHashOps("namehash").values(); System.out.println(values); } @Test public void testGetValueByKey(){ Object object = redisTemplate.boundHashOps("namehash").get("b"); System.out.println(object); } @Test public void testRemoveValueByKey(){ redisTemplate.boundHashOps("namehash").delete("c"); }}