概述
今天使用redis锁犯了一个低级的错误,锁的时间设置太短,导致多线程跑时,造成对数据的重复处理,对自己编码习惯做一个深刻的反思,使用redis这种实时存储的服务,存储要考虑容量,速度,安全,但是在实时方面,过期时间应该是一个很重要的参数,不应忽略.值此反思之际,顺便对redis认知作一个简陋的总结.
redis是一个key_value的存储系统,支持存储的类型包括string,list,set,zset,hash,对数据的操作有push/pop,add/remove以及交并差集等,重要的一点,这些操作多事原子性.今天主要整理的是redis与spring的整合以及使用.
spring集成redis(spring-redis-data),现在以常用的模板使用为例.其集成的思路跟之前spring集成hibernate很相似,redis对应数据库,配置中有池,有工厂,模板内封装有连接.
spring整合redis
搭建环境
环境:可以正常访问的redis服务器+spring4.3.4.RELEASE
redis服务的简单搭建,用于测试,windows下,搭建简单redis
https://github.com/dmajkic/redis/downloads 下载,选择对应的32位或64,我的是64位,cmd窗口下进入64bit的文件夹,执行redis-server.exe redis.conf便可默认启动redis,测试redis安装是否成功,双击redis-cli.exe,进入新的cmd窗口,插入一条记录set hello hi,查询get hello,得到"hi",安装成功
pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring整合redis,模板.工厂.连接池等 -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
<!--spring测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<!--redis客户端,连接redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
这里有个地方注意,spring-test 版本与junit版本要匹配,不然会测试会报错
redis.properties
#访问地址
redis.host=localhost
#访问端口
redis.port=6379
#注意,如果没有password,此处不设置值,但这一项要保留
redis.password=
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=100
#最小空闲数
redis.minIdle=10
#连接池的最大数据库连接数。设为0表示无限制
redis.maxActive=600
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=1000
#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis.testOnBorrow=true
spring-redis.xml
<!--ignore-unresolvable=“true" 设置true找不到不会报错,默认false-->
<context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="false"/>
<!-- redis连接池 -->
<bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--以下所有的参数配置可以在JedisPoolConfig中查找,都有其相应的默认值-->
<property name="maxTotal" value="${redis.maxActive}"></property>
<property name="minIdle" value="${redis.minIdle}" />
<property name="maxIdle" value="${redis.maxIdle}"></property>
<property name="maxWaitMillis" value="${redis.maxWait}"></property>
<property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
</bean>
<!-- redis连接工厂 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<property name="password" value="${redis.password}"></property>
<property name="poolConfig" ref="jedisConfig"></property>
</bean>
<!-- redis操作模板,这里采用尽量面向对象的模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!-->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
<!--开启事务-->
<property name="enableTransactionSupport" value="true"/>
</bean>