Spring整合redis

Spring Data Redis

Redis介绍

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库

Redis 是如今的互联网较为流行的NoSQL数据库,解决了一些高并发应用场景的需求问题。例如抢红包,秒杀活动,这些应用的实现主要得益于Redis数据库高性能、高响应特性。
Redis作为主流Redis数据库拥有以下优点:
- 高性能: Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据结构: Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子性:Redis的所有操作都是原子性的。
- 丰富特性: Redis还支持 publish/subscribe, 通知, key 过期等等特性。

主要应用场景:
- 缓存
- 高并发

数据结构

Redis支持五种数据结构:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
- String(字符串)
string是Redis基本数据类型,一个key对应一个value,并且是二进制安全的。string可以包含任何数据,比如图片或者序列化对象

127.0.0.1:6379> SET name "redis"
OK
127.0.0.1:6379> GET name
"redis"
  • Hash(哈希)
    Redis hash是一个键值对集合,string类型的field和value映射表,即java中的map
127.0.0.1:6379>HMSET myhash field1 "hello" field2 "world"
OK
127.0.0.1:6379>HGET myhash field1
"hello"
127.0.0.1:6379>HGET myhash field2
"world"
  • List(列表)
    Redis 列表是简单的字符串列表,按照插入顺序排序,可以添加元素到列表的左侧或者右侧
127.0.0.1:6379> lpush list redis
(integer) 1
127.0.0.1:6379> lpush list mongodb
(integer) 2
127.0.0.1:6379> lpush list rabitmq
(integer) 3
127.0.0.1:6379> lrange list 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
- Set(集合)
Redis Set是string类型的无序集合,元素不可重复

127.0.0.1:6379> sadd set redis
(integer) 1
127.0.0.1:6379> sadd set mongodb
(integer) 1
127.0.0.1:6379> sadd set rabitmq
(integer) 1
127.0.0.1:6379> sadd set rabitmq
(integer) 0
127.0.0.1:6379> smembers set
1) "redis"
2) "rabitmq"
3) "mongodb"

注意:由于rabitmq添加了两次,但根据集合内元素的唯一性,第二次插入的元素将忽略

  • Zset(sorted set:有序集合)
    Redis zset是有序的集合,同样不允许重复
    添加元素到集合,元素在集合中存在则更新对应的score
zadd key score member
127.0.0.1:6379> zadd zset 0 redis
(integer) 1
127.0.0.1:6379> zadd zset 0 mongodb
(integer) 1
127.0.0.1:6379> zadd zset 0 rabitmq
(integer) 1
127.0.0.1:6379> zadd zset 0 rabitmq
(integer) 0
127.0.0.1:6379> > ZRANGEBYSCORE zset 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

Spring Data Redis

Spring Data Redis, part of the larger Spring Data family, provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural concerns.
Spring Data Redis是更大的SpringData家族的一部分,它提供了简单的配置和从Spring应用程序访问Redis。它提供了用于与数据库交互的低级和高级抽象,从而将用户从基础设置的关注中解放出来。

Redis连接工厂

Spring Data Redis包含了多个模板实现,用来完成对Redis数据库的数据存取操作,但是为了创建数据模板我们首先需要有一个Redis连接工厂,而Spring DataRedis为四种Redis客户端实现提供了连接工厂,而这些连接工厂在适用性
上大都相同。
- JedisConnectionFactory
- JredisConnectionFactory
- LettuceConnectionFactory
- SrpConnectionFactory

可以根据需要选择不同的连接工厂,本文选择的是Jedis的连接工厂实现。

Spring Data Redis模板

Redis连接工厂会生成Redis key-value存储的连接(以RedisConnection的形式),借助RedisConnection,可以存储和读取数据,而这种方式操作数据需要通过字节数组,所以SpringDataRedis以模板板的形式为我们提供了更高级的数据访问方案。
Spring Data Redis提供了两个模板:
- RedisTemplate
- StringRedisTemplate

两者不同的地方在于StringRedisTemplate扩展了RedisTemplate,只关注于String类型。
当我们有了模板后便可以对数据库key-value条目进行增删保存。
RedisTemplate提供了不同的方法操作数据

方法描述
opsForValue()操作简单值的条目
opsForList()操作具有list值的条目
opsForSet()操作具有set值的条目
opsForZSet()操作具有排序set值的条目
opsForHash()操作具有hash值的条目
boundValueOps(K)以绑定指定key的方式,操作具有简单的条目
boundListOps(K)以绑定指定key的方式,操作具有list值的条目
boundSetOps(K)以绑定指定key的方式,操作具有set值的条目
boundZSetOps(K)以绑定指定key的方式,操作具有排序set值的条目
boundHashOps(K)以绑定指定key的方式,操作具有hash值的条目

当我们掌握了这些内容后就可以进行Spring整合Redis的内容

序列化器

当某个条目保存到Redis key-value存储时,key和value会使用Redis的序列化器进行序列化。Spring Data Redis 提供了多个序列化器。
- GenericToStringSerializer : 使用Spring转换服务进行序列化
- JacksonJsonRedisSerializer : 使用Jackson1将对象序列化为json
- Jackson2JsonRedisSerializer : 使用Jackson2将对象序列化为json
- JdkSerializationRedisSerializer : 使用Java序列化
- StringRedisSerializer : 序列化String类型的key和value
- OxmSerializer : 用于XML序列化

Spring整合Redis

1.首先在Maven项目的pom文件中引入Spring Data Redis的依赖。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency>

2.创建applicationContext-redis.xml,选择使用jedis连接工厂

<!-- jedis 连接池配置 -->
 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
    <property name="maxIdle" value="300" />        
    <property name="maxWaitMillis" value="3000" />  
    <property name="testOnBorrow" value="true" />  
</bean>  

<!-- jedis 连接工厂 -->
<!-- host-name:连接IP port:连接端口 pool-config-ref:连接池 database:数据库 password:数据库密码 -->
<bean id="redisConnectionFactory"  
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
    p:host-name="192.168.84.131" p:port="6379" p:pool-config-ref="poolConfig"  
    p:database="0" />  

<!-- spring data 提供 redis模板  -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
    <property name="connectionFactory" ref="redisConnectionFactory" /> 
    <!-- 如果不指定 Serializer 默认为JdkSerializationRedisSerializer  -->
    <property name="keySerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </property>
    <property name="valueSerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"> 
        </bean>
    </property> 

3.在applicationContext.xml文件中引入

<!-- 加载Redis配置 -->
<import resource="applicationContext-cache.xml"/>

4.接下来写一个测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringRedisTest {

    // 注入RedisTemplate模板
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Test
    public void test(){
        // 设置key-value,有效时间
        redisTemplate.opsForValue().set("city", "beijing",30,TimeUnit.SECONDS);
        System.out.println(redisTemplate.opsForValue().get("city"));
    }

}

到这里便完成了一个简单的Spring整合Redis的Demo

参考:

[1] Spring Data Redis官网
[2] Spring实战(Spring IN ACTION) Craig Walls 著
[3] 菜鸟教程|Redis教程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值