前言:
由于项目中迫切需要先实现将session中的数据放入到redis中,所以我先研究了如何连接redis服务端,并实现存取的操作,至于redis缓存,我过一段时间再补充。
一、什么是redis
Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API.
二、为什么要用redis
- 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率
- 性能需求, 随着读操作的量的上升需要解决,经历的过程有:
数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis - 解决写的问题:
水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表; -
可靠性需求
Cache的"雪崩"问题让人纠结
Cache面临着快速恢复的挑战 -
开发成本需求
Cache和DB的一致性维护成本越来越高(先清理DB, 再清理缓存, 不行啊, 太慢了!)
开发需要跟上不断涌入的产品需求
硬件成本最贵的就是数据库层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件; -
维护性复杂
一致性维护成本越来越高;
BerkeleyDB使用B树,会一直写新的,内部不会有文件重新组织;这样会导致文件越来越大;大的时候需要进行文件归档,归档的操作要定期做;
这样,就需要有一定的down time;
三、如何使用redis
一、安装redis
安装教程地址:http://www.runoob.com/redis/redis-install.html
二、相关配置
更改端口号:
默认端口为6379,如果linux上该端口被墙了,可以尝试换一个端口。
cd $REDIS_HOME (进入redis主目录)
mkdir conf (创建conf目录,用于存放配置)
cd conf (进入conf目录)
cp ../redis.conf redis7030.conf (将上级目录下的redis.conf复制到当前目录,并重命名为redis7030.conf)
vi redis7030.conf (用vi编辑该配置文件)
找到:
daemonize no,将no改成yes
port 7030,将6379改成7030
然后保存退出
指定启动、停止命令:
先停止redis
./redis-cli -p 7030 shutdown
为了以后运维更轻松,可以利用alias做几个别名,
vi ~/.bashrc
alias redis="cd /opt/app/redis/redis-2.8.17/src"
alias startRedis="/opt/app/redis/redis-2.8.17/src/redis-server /opt/app/redis/redis-2.8.17/conf/redis7030.conf"
alias stopRedis="/opt/app/redis/redis-2.8.17/src/redis-cli -p 7030 shutdown"
具体路径,大家根据实际情况调整,保存退出,重新连接到linux终端
redis 即可直接进入redis根目录
startRedis 即启动redis
stopRedis 即停止redis
配置redis密码:
redis在真实环境中不可以谁想访问就访问,所以,必须要设置密码,修改redis.conf文件配置
# requirepass foobared去掉注释,foobared改为自己的密码
三、spring下整个配置redis
配置文件:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxTotal}" /> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <!-- redis的连接池pool,不是必选项:timeout/password --> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1" value="${redis.host}" /> <constructor-arg index="2" value="${redis.port}" type="int" /> <constructor-arg index="3" value="60000" type="int" /> </bean>
maven依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.4.2</version>
</dependency>
spring基于注解引用:
在Controller层或者Service层注入:
@Autowired
private JedisPool jedisPool;
进行存储:
Jedis jedis = jedisPool.getResource();
jedis.set("3", "333");
四、可能遇到的错误
Invalid property ‘maxWait’ of bean class [redis.clients.jedis.JedisPoolConfig]: Bean property ‘maxWait’ is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
这说明高版本的jedis中移除了这两个属性
通过查看确实是这样的
新版本的jedis中将maxActive改成了maxTotal , MaxWait改成了MaxWaitMillis
所以poolConfig中向我这样写就可以了
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}"></property>
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
四、连接服务端exe程序
redis-desktop-manager-0.8.8.384