>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19976 个阅读者 刷新本主题
 * 贴子主题:  Redis安装、Redis基本数据类型、Jedis、Redis集群搭建 回复文章 点赞(0)  收藏  
作者:javathinker    发表时间:2020-06-16 08:12:23     消息  查看  搜索  好友  复制  引用

    

.目录

本文将从以下几个方面介绍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,如果没有安装,可以使用以下命令进行安装:


    yum install gcc-c++

  •   安装好编译环境后,解压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下的文件列表

                            点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

    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服务端

    执行

    bin/redis-cli

    连接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

  1. "rabitmq"
  2. "mongodb"
  3. "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

  1. "redis"
  2. "rabitmq"
  3. "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

  1. "mongodb"
  2. "rabitmq"
  3. "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包如下:

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

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    

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

<!-- 连接池配置 -->

  <bean id=*"jedisPoolConfig"* class=*"redis.clients.jedis.JedisPoolConfig"*>

  <!-- 最大连接数 -->

  <property name=*"maxTotal"* value=*"30"* />

  <!-- 最大空闲连接数 -->

  <property name=*"maxIdle"* value=*"10"* />

  <!-- 每次释放连接的最大数目 -->

  <property name=*"numTestsPerEvictionRun"* value=*"1024"* />

  测试代码:    

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架构图

            点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

redis集群架构图.jpg

         redis-cluster投票:容错

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

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 会根据节点数量大致均等的将哈希槽映射到不同的节点

                        点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小        

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前的注释去掉。
            点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

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 重新编辑]
  Java面向对象编程-->接口
  JavaWeb开发-->使用过滤器
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->用Swing组件展示HTML文档
  精通Spring-->绑定表单
  Vue3开发-->绑定表单
  解决javac编译错误: 编码UTF8/GBK的不可映射字符
  为网站代码块pre标签增加一个复制代码按钮代码
  整理收集的一些常用java工具类
  JDK自带JVM调优工具的用法
  [讨论]书中多线程章节的语言表述有误?
  超详细的Java运算符修炼手册(优秀程序员不得不知道的运算技...
  java常见的几种调用机制:同步调用,异步调用,回调
  Java读取大文件的高效率实现_java大文件
  Java设计模式:迭代器模式
  Java设计模式:享元模式
  Java设计模式:装饰器模式
  redis持久化问题处理
  Java虚拟机(JVM)的内存结构
  Java 入门实用代码:从 List列表中 截取子列表
  Java入门实用代码: List 列表中元素的替换
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。