|
.目录 本文将从以下几个方面介绍redis的使用:
1. redis 安装、启动、停止
2. redis基本数据类型
3. jedis 连接redis
4. redis 集群搭建
1.redis 安装 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Linux 下安装- 点击此处,下载redis*
- 下载完成后将使用SSH工具将redis-x.x.x.tar.gz上传到Linux服务器上
- 复制redis压缩包到用户目录下:
cp redis-x.x.x.tar.gz /usr/local/redis |
- redis的压缩包是源码级的需要编译才能使用,编译redis需要安装gcc,如果没有安装,可以使用以下命令进行安装:
- 安装好编译环境后,解压redis压缩包并进入redis-x.x.x文件夹中进行编译,注意此时该文件夹中应该包含一个Makefile文件
tar -xvf redis-x.x.x.tar.gz
cd redis-x.x.x
make |
- make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下,或者指定安装目录:
安装到指定目录,如 /usr/local/redis
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install |
- redis.conf
redis.conf是redis的配置文件,redis.conf在redis源码目录。
注意修改port作为redis进程的端口,port默认6379 - 拷贝配置文件到安装目录下
进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下
cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin |
- 安装目录bin下的文件列表
bin文件夹文件列表
- redis启动
前端模式启动:
直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束。
后端模式启动:
执行如下命令启动redis:
cd /usr/local/redis
./bin/redis-server ./redis.conf |
- redis默认使用6379端口
- redis停止
强行终止Redis进程可能会导致redis持久化数据丢失。正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:
cd /usr/local/redis
./bin/redis-cli shutdown |
- 连接redis服务端
执行
连接redis服务端.
2. redis基本数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
实例
redis 127.0.0.1:6379> SET name "javathinker.net"
OK
redis 127.0.0.1:6379> GET name
"javathinker.net" |
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为javathinker.net。
注意:一个键最大能存储512MB。
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
实例
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World" |
以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。
每个 hash 可以存储 232 -1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
实例
redis 127.0.0.1:6379> lpush javathinker.net redis
(integer) 1
redis 127.0.0.1:6379> lpush javathinker.net mongodb
(integer) 2
redis 127.0.0.1:6379> lpush javathinker.net rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange javathinker.net 0 10 |
- "rabitmq"
- "mongodb"
- "redis"
redis 127.0.0.1:6379>
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。 Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
sadd key member
实例
redis 127.0.0.1:6379> sadd javathinker.net redis
(integer) 1
redis 127.0.0.1:6379> sadd javathinker.net mongodb
(integer) 1
redis 127.0.0.1:6379> sadd javathinker.net rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd javathinker.net rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers javathinker.net |
- "redis"
- "rabitmq"
- "mongodb"
注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
实例
redis 127.0.0.1:6379> zadd javathinker.net 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd javathinker.net 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd javathinker.net 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd javathinker.net 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE javathinker.net 0 1000 |
- "mongodb"
- "rabitmq"
- "redis"
3.jedis连接redis 3.1 jedis介绍 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。
Jedis同样也是托管在github上,地址:jedis
3.2 通过jedis连接redis单机 3.2.1 jar包 pom坐标:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency> |
jar包如下:
jedis jar包
3.2.2 单实例连接 通过创建单实例jedis对象连接redis服务,如下代码:
// 单实例连接redis
@Test
public void testJedisSingle() {
Jedis jedis = new Jedis("192.168.101.3", 6379);
jedis.set("name", "bar");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
|
3.2.2.1连接超时解决 由于linux防火墙默认开启,redis的服务端口6379并不在开放规则之内,所有需要将此端口开放访问或者关闭防火墙。
关闭防火墙命令:sevice iptables stop
如果是修改防火墙规则,可以修改:/etc/sysconfig/iptables文件
3.2.3 使用连接池连接 通过单实例连接redis不能对redis连接进行共享,可以使用连接池对redis连接进行共享,提高资源利用率,使用jedisPool连接redis服务,如下代码:
@Test
public void pool() {
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数
config.setMaxTotal(30);
//最大连接空闲数
config.setMaxIdle(2);
JedisPool pool = new JedisPool(config, "192.168.101.3", 6379);
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
|
3.2.4 jedis与spring整合 配置spring配置文件applicationContext.xml
测试代码:
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
}
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
try {
Jedis jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(jedis != null){
//关闭连接
jedis.close();
}
}
} |
4. redis 集群搭建 4.1. redis-cluster架构图
redis集群架构图.jpg
redis-cluster投票:容错
redis集群容错.jpg
4.2架构细节: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
4.3 Redis集群的搭建 Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。Redis集群至少需要6台服务器。搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006
4.3.1. 集群搭建环境 (1)、使用ruby脚本搭建集群。需要ruby的运行环境。安装ruby
yum install ruby
yum install rubygems |
(2)、安装ruby脚本运行使用的包。
gem install redis-3.0.0.gem |
4.3.2. 搭建步骤 需要6台redis服务器。搭建伪分布式。需要6个redis实例。需要运行在不同的端口7001-7006
- 第一步:创建6个redis实例,每个实例运行在不同的端口。需要修改redis.conf配置文件。配置文件中还需要把cluster-enabled yes前的注释去掉。
redis.config
- 第二步:启动每个redis实例。
- 第三步:使用ruby脚本搭建集群。
/redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006 |
[root@localhost redis-cluster]# vim shutdow-all.sh
redis01/redis-cli -p 7001 shutdown
redis01/redis-cli -p 7002 shutdown
redis01/redis-cli -p 7003 shutdown
redis01/redis-cli -p 7004 shutdown
redis01/redis-cli -p 7005 shutdown
redis01/redis-cli -p 7006 shutdown
[root@localhost redis-cluster]# chmod 744 shutdow-all.sh |
4.3.3 集群的使用方法 Redis-cli连接集群
[root@localhost redis-cluster]# redis01/redis-cli -p 7002 -c
-c:代表连接的是redis集群 |
4.3.4Jedis 连接redis集群- 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
- 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
- 第三步:打印结果
- 第四步:系统关闭前,关闭JedisCluster对象
@Test
public void testJedisCluster() throws Exception {
// 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.153", 7001));
nodes.add(new HostAndPort("192.168.25.153", 7002));
nodes.add(new HostAndPort("192.168.25.153", 7003));
nodes.add(new HostAndPort("192.168.25.153", 7004));
nodes.add(new HostAndPort("192.168.25.153", 7005));
nodes.add(new HostAndPort("192.168.25.153", 7006));
JedisCluster jedisCluster = new JedisCluster(nodes);
// 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
jedisCluster.set("hello", "100");
String result = jedisCluster.get("hello");
// 第三步:打印结果
System.out.println(result);
// 第四步:系统关闭前,关闭JedisCluster对象。
jedisCluster.close();
} |
----------------------------
原文链接:https://www.jianshu.com/p/5af1508eb575
作者: 泛空秋慕
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 flybird 在 2020-06-18 20:05:16 重新编辑]
|
|