一、安装
下载安装
下载:http://download.redis.io/releases/redis-3.0.0.tar.gz
安装GCC(Ubuntu16.0.4环境下)
sudo apt-get install gcc-4.8
参考地址:download.redis.io/releases/redis-3.0.0.tar.gz
3、 安装
我喜欢将软件安装在/opt目录下,而不是/usr/local/下。
创建redis目录:
cd /opt
sudo mkdir redis
复制redis安装包到这
sudo cp ~/下载/redis-3.0.0.tar.gz /opt/redis
解压:
lxj@Lenovo:/opt/redis$ sudo tar -zxvf redis-3.0.0.tar.gz
编译:
安装到redis目录:
后端启动:
将redis解压文件下的redis.conf 拷贝到bin目录下
lxj@Lenovo:/opt/redis/redis-3.0.0$ sudo cp redis.conf /opt/redis/bin/
修改redis.conf的权限
lxj@Lenovo:/opt/redis/bin$ chmod 777 redis.conf
编辑将daemonize yes置为yes支持后端启动
后端启动:
lxj@Lenovo:/opt/redis/bin$ ./redis-server redis.conf
查看redis进程:ps -aux|grep redis
关闭:./bin/redis-cli shutdown
redis常用的命令:
数据类型:
String、Hash、List、set、treeset
用的String最多!
Set str 1234
get str
incr st 没有这个就默认的值为1,每使用一次就加一
decr st 减一
设置key的有效期:
expire str 100
ttl 查看key的有效期 -1 永久保存 -2 不存在
keys * 查看redis中有多少个key。
二、Jedis客户端使用
添加maven依赖
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<jedis.version>2.7.2</jedis.version>
</dependency>
@Test
public void JedisTest() {
// 创建一个Jedis对象,指定服务的IP和端口号
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 直接操作数据库
jedis.set("lier", "boolean");
System.out.println(jedis.get("lier"));
jedis.close();
}
public void JedisPoolTest() {
// jedis连接池:
/*
* 1、创建一个数据库连接池
* 2、从连接池获取连接
* 3、获取数据
* 4、关闭连接
* 系统关闭钱关闭连接池。=
*/
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
Jedis jedis = jedisPool.getResource();
System.out.println(jedis.get("lier"));
jedis.close();
jedisPool.close();
}
三、redis伪集群搭建
搭建
1、创建集群目录
sudo mkdir cluster
看情况是否改变权限
2、复制bin目录下的文件
3、修改端口、设置集群模式
端口从7001-7006
cluster-enabled yes
4、启动这六个redis实例
vim start-all.sh
cd redis_01
./redis-server redis.conf
cd ..
cd redis_02
./redis-server redis.conf
cd ..
cd redis_03
./redis-server redis.conf
cd ..
cd redis_04
./redis-server redis.conf
cd ..
cd redis_05
./redis-server redis.conf
cd ..
cd redis_06
./redis-server redis.conf
然后chmod +x start-all.sh 添加执行权限
安装ruby运行环境
sudo apt-get ruby 安装最新版的ruby
安装Rubygems安装
https://rubygems.org/pages/download
解压,sudo ruby setup.rb
安装redis和ruby的借口
Gem install redis --version 3.0.0
注意:gem install redis --version 3.0.0 失败的话,需要修改一下gem的源
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
不过我的没有换成功
直接下载redis-3.0.0.gem
sudo gem install redis-3.0.0.gem
-rwxrwxr-x 1 root root 48141 4月 1 2015 redis-trib.rb*
执行脚本命令
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
1的意思是指每个节点有一个备份机
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: 738265181aa908d53c2ffc3bbd3d47a7c6e1f418 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: ba6818a1ff315336fb3d87b8cd9c13b0fbe9768b 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: 614cc5f5ba6eaef636f3e8a5bd2f507ef33487ba 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 70cbd4ec3a02f744a1fa347e0e5ca4e2e65ca64b 127.0.0.1:7004
replicates 738265181aa908d53c2ffc3bbd3d47a7c6e1f418
S: 94ab07591b4e9741e71252187cb352cfd7dc6c99 127.0.0.1:7005
replicates ba6818a1ff315336fb3d87b8cd9c13b0fbe9768b
S: 02f4525afb8dd6bf821de59b8c44327d91a9238b 127.0.0.1:7006
replicates 614cc5f5ba6eaef636f3e8a5bd2f507ef33487ba
从节点是否槽看到12了
使用(单机、连接池、集群模式)
策略+实现类策略模式:针对不同的场景使用不同的实现类
package com.taotao.content.jedis;
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
}
package com.taotao.content.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.JedisCluster;
//集群模式
public class JedisClientCluster implements JedisClient {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Boolean exists(String key) {
return jedisCluster.exists(key);
}
@Override
public Long expire(String key, int seconds) {
return jedisCluster.expire(key, seconds);
}
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long hset(String key, String field, String value) {
return jedisCluster.hset(key, field, value);
}
@Override
public String hget(String key, String field) {
return jedisCluster.hget(key, field);
}
@Override
public Long hdel(String key, String... field) {
return jedisCluster.hdel(key, field);
}
}
package com.taotao.content.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
//连接池模式
public class JedisClientPool implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, field);
jedis.close();
return result;
}
}
Spring相关配置(两者开启一个就行)
<!-- 开启注解,一般开启报扫描会自动开启注解,但是不能代替注解驱动 -->
<context:annotation-config></context:annotation-config>
<!-- redis单机版 -->
<!-- <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<bean id="jedisClientPool" class="com.taotao.content.jedis.JedisClientPool"></bean> -->
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.taotao.content.jedis.JedisClientCluster"></bean>
测试
测试:
@Test
public void JedisClientTest() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:Spring/ApplicationConfig-redis.xml");
JedisClient clent=(JedisClient) ctx.getBean(JedisClient.class);
System.out.println(clent.get("name"));
}
业务代码加入缓存
@Override
public List<TbContent> getTbContentsByContentCategory(Long contentCategoryId) {
// 先查询缓存中是否有数据,如果有就返回,没有查询数据,将数据放入缓存中然后在返回数据
// 查询和添加缓存不能影响正常的业务逻辑
List<TbContent> contents = null;
String ad1 = null;
try {
ad1 = jedisClient.hget(INDEX_CONTENT, contentCategoryId + "");
if (StringUtils.isNotEmpty(ad1)) {
contents = JsonUtils.jsonToList(ad1, TbContent.class);
return contents;
}
} catch (Exception e) {
e.printStackTrace();
}
TbContentExample contentExample = new TbContentExample();
Criteria criteria = contentExample.createCriteria();
criteria.andCategoryIdEqualTo(contentCategoryId);
contents = contentMapper.selectByExample(contentExample);
try {
jedisClient.hset(INDEX_CONTENT, contentCategoryId + "", JsonUtils.objectToJson(contents));
} catch (Exception e) {
e.printStackTrace();
}
return contents;
}
缓存的同步处理,对于后台更新的数据,要及时同步所以在增删改需要清除缓存