Redis介绍

 

Redis是一种数据库,能够存储数据,管理数据的一种软件。

数据库应用的发展历程:

1.单机数据库,一个应用,一个数据库实例

2.缓存、水平切分时代

3.读写分离时代

4.分表分库时代(集群)

关系型数据库:oracle、mysql、DB2、sqlserver。。。。

非关系型数据库(NoSql):彻底改变底层存储机制,不再采用关系型数据模型,而是采用聚合数据结构存储数据。

Redis是一个用C语言编写的,开源的,基于内存运行并支持持久化的,高性能的NoSQL数据库,也是当前热门的NoSQL数据库之一。

Redis中的数据大部分时间都是存储内存中的,适合存储频繁访问,数据量比较小的数据,缓存数据库。

Redis特点

1.支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

2.支持多种数据结构,不仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。

3.支持数据备份,即master-slave模式的数据备份。

安装Redis

第一步:去官网https://Redis/io下载安装包

第二步:使用Xftp工具把安装包(redis-6.0.16.tar.gz)上传到Linux系统中的 /opt目录

第三步:解压安装包到 /opt目录    tar -zxvf redis-6.0.16.tar.gz -C /opt

因为redis-6.0.16/src目录下都是c语言,编译c语言需要用到gcc的编译器

 第四步:安装gcc(GNU compiler collection)的缩写,它是Linux下一个预编译集合(相当于javac),是c或c++程序的编译器

方式一:有外网的情况下使用yum安装,执行命令:yum -y install gcc

方式二:没有外网情况下,从光盘里进行安装

               从终端进入目录:/rum/media/root/CentOS 7 x86_64/Packages

               依次执行命令:

                rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm  回车

                rpm -ivh cpp-4.8.5-11.el7.x86_64.rpm  回车

                rpm -ivh kernel-headers-3.10.0-514.el7.x86_64.rpm  回车

                rpm -ivh glibc-headers-2.17-157.el7.x86_64.prm  回车

                rpm -ivh glibc-devel-2.17-157.el7.x86_64.rpm  回车

                rpm -ivh libggomp-4.8.5-11.el7.x86_64.rpm  回车

                rpm -ivh gcc-4.8.5-11.el7.x86_64.rpm  回车

查看gcc是否安装好使用命令:gcc -v

 第五步:在/redis-6.0.16目录里执行make命令进行编译c语言

 第六步:执行make install 安装Redis

 注意:在make执行之后在执行 make install,该操作则将src下的许多可执行文件复制到/usr/local/bin目录下,这样做可以在任意目录执行redis的软件命令(例如,启动、停止、客户端连接服务器等等),make install也可以不用执行,看个人习惯。

第七步:启动Redis

方式一:前台启动redis-server  占用终端命令行

方式二:后台启动redis-server &  (推荐使用后台启动)

方式三带配置文件启动:redis-server redis.conf配置文件位置 &

默认占用6379端口

 关闭Redis:redis-cli shutdown

第八步:连接Redis的客户端

               redis-cli:是redis自带客户端,使用redis-cli就可以启动redis的客户端程序

               redis-cli:默认连接本机(127.0.0.1)的6379端口的Redis服务器

 redis-cli -p 端口号:连接本机(127.0.0.1)指定端口号上的Redis服务

 redis-cli -h  ip地址  -p  端口号:连接指定ip主机,指定端口号上的redis服务

退出客户端:exit

Redis的基本知识和命令

1.查看redis服务是否正常运行:ping

 2.查看redis服务器的统计信息

info:查看redis服务器的所有信息

info [信息段] :查看redis服务器的指定的统计信息,如:info Replication

3.redis的数据库实例:redis中的数据库实例只能有redis服务来创建和维护,开发人员不能修改和自行创建数据库实例,默认情况下,redis会自动创建16个数据库实例,并且给这些数据库实例编号,从0开始一直到15,使用时通过编号来使用数据库。可以通过配置文件,指定redis自动创建数据库个数,redis的每个数据库实例本身占用的存储空间很少,所以也不造成存储空间的浪费。

        默认使用的是0数据库

        切换数据库:select  2,切换到2数据库

 4.查看当前数据库中的key的数量:dbsize

        

 5.查看都有哪些key:keys *

   

 6.清空当前数据库:flushdb

7.清空所有数据库数据:flushall

8.查看redis中所有的配置信息: config get *

Redis5种数据结构

1.字符串类型string

        字符串类型是redis中最基本的数据结构,它能存储任何数据类型,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M

   key                 value

username           张三

2.列表类型list

redis列表是简单的字符串列表,按照插入顺序排列,你可以添加一个元素到列表的头部或者尾部,底层是一个链表结构

key                                                   value

region                                    北京、上海、天津

3.set集合类型

redis的set是string类型的无序无重复集合

key                                           value

                                               spring

framework                              mybatis

                                               struts

4.哈希类型hash

redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

key                          loginuser

field                         value

uname                     张山

times                         5

region                      北京

5.有序集合类型zset(sorted set)

redis有序集合zset和集合set一样也是string类型元素的集合,且不允许重复,不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序

key                                                 value  score

                                                       张三 3500

salary                                             李四 5000

                                                        周莉 8000

Redis数据库通用操作命令

1.redis中关于key的操作命令:

        查看数据库中的key:keys  *

        查看以k开头的key:keys k*

        查看以k开头b结尾的key:keys k*b

2.判断key在数据库中是否存在:exists key    存在返回1,不存在返回0

        

 3.移动指定key到指定的数据库中:move key  数据库编号

4.查看指定key的剩余生存时间:ttl key

                没有设置生存时间返回-1

                如果key不存在返回-2

5.设置key的最大生存时间:expire key 秒

                expire k2  20,,k2生存周期20秒,超过20秒就会被自动删除

6.查看指定key的数据类型:type key

        

 7.重命名key:rename key  新名字

8.删除指定key:del  key key key   

        返回实际的删除数量

        

Redis中有关String类型数据的操作命令

1.添加:set  key  value

2.获取值:get key

3.追加字符串:append key  追加字符串

                返回追加之后的字符串长度

                key不存在,则新建一个key存放追加字符串

        

 4.获取字符串长度:strlen key

        

5.将字符串数值进行加1运算:incr key

                返回加1运算之后的数据

                如果key不存在,首先设置一个key,初始值为0,然后进行加1运存

                要求key的value值必须是数值,否则报错

                

 6.减1运算:decr key

                返回减1之后的数据

                如果key不存在,首先设置一个key,初始值为0,然后进行减1

                要求key的value值必须是数值,否则报错

7.加任意数值:incrby key 任意数值

                返回加任意数运算之后的数据

                如果key不存在,首先设置一个key,初始值为0,然后进行减1

                要求key的value值必须是数值,否则报错

8.减任意数值:decrby key 任意数

               返回加任意数运算之后的数据

                如果key不存在,首先设置一个key,初始值为0,然后进行减1

                要求key的value值必须是数值,否则报错

 9.获取闭区间的value:getrange key 下标  下标

                                      getrange k1 0 5

                                      从左往右数就是012345......           从右往左数就是-1 -2 -3 -4 -5.......

10.覆盖value值:setrange key 5 字符串

 11.添加key时同时设置它的最大生命周期:setex key  生命周期 value

        

12.添加key,当数据库中没有同名key时添加,有则放弃:setnx key value

13.批量添加string类型的key value:mset key1 value1 key2 value2.....

14.批量获取string类型的数据:mget key1 key2......

15.批量设置string类型的数据value到redis数据库中,当所有key都不存在时设置成功,只要有一个key存在,放弃设置。

                msetnx k1 v1 k2 v2....

                

Redis中有关List类型数据的操作命令

1.将一个或多个值一次插入到列表的表头(左侧):lpush key value value....... 

         存入顺序是 1  2  3  4   5......

         放到库里的顺序是 ....5  4  3  2  1

         

  2.获取指定列表中指定下标区间的元素:lrange key 下标 下标

        

 3.将一个或多个值一次插入到列表的表尾:rpush key  value value...

        存入顺序:1 2 3 4 5...

        放到库里顺序:1 2 3 4 5...

        

 4.删除指定列表表头元素并返回删除的元素:lpop key

         

5. 删除指定列表表尾元素并返回删除的元素:rpop key

6.根据count值,删除指定列表中跟value一样的元素:lrem key count value

                count值>0:从列表的表头(左侧)移除count个跟value相等的值

                count值<0:从列表的表尾(右侧)移除count个跟value相等的值

                count值=0:从列表中移除所有跟value相等的值

7.获取指定列表中指定下标元素:lindex key 下标

        

8. 获取指定列表的长度:llen kye

        

 Redis中有关set类型数据的操作命令

     单key,多无序value

     一个key对应多个value,value之间没有顺序,并且不能重复

1.将一个或多个元素添加到指定的集合中:sadd key value value...

        如果元素存在,则会忽略不添加

        返回成功添加元素的个数

        

 2.获取指定集合中所有元素:smembers key

        

3.判断指定元素在指定集合中是否存在:sismember key 指定元素

        返回1,存在

        返回0,不存在

        

4.删除集合中,指定元素或多个元素 :srem key value value..

        

5.随机获取集合中的一个或多个元素:srandmember key  数量

        

6. 从指定集合中随机移除一个或多个元素:spop key 数量

        

 7.将指定集合的指定元素移动到另一个集合中:smove 源集合 目标集合  移动的值

        

 8.求差集,获取指定第一个集合里有,其他集合里没有的数据:

                sdiff set set set...

                

9.求交集,获取集合中都有的数据:sinter  set set set....

                

10.求并集,获取指定集合的并集,重复元素不要:sunion set set set...

                

  Redis中有关hash类型数据的操作命令

                 key:field-value field-value.....

                例,student:id 2001 age 20 name zs

1.添加数据到哈希表中:hset key 属性 值 属性 值

        

2.获取哈希表中指定数据:hget key 属性

        

3.批量获取指定哈希表中的属性值:hmget student id name age

        

 4.根据key获取key中所有的属性名和属性值

        

 5.从哈希表中删除指定的属性和属性值:hdel key 属性名

        

 6.获取指定哈希表中 属性名和属性值的个数:hlen key

        

7.判断指定哈希表中是否存在某一个属性名和属性值

                hexists key 属性名

                返回1存在,返回0不存在

               

 8.获取哈希表中所有的属性名: hkeys key

        

 9.获取哈希表中所有的属性值:hvals key

        

 10.将一个属性名和属性值添加到哈希表中,如果表中已存在该属性名和属性值就放弃添加

                hsetnx student age 22

                

  Redis中有关zset类型数据的操作命令

zset:有序集合,本质上是集合,所有元素不能重复,

           每一个元素都关联一个分数,redis会根据分数对元素进行自动排序,分数可以重复

           既然有序集合中每一个元素都有顺序,那么也都有下标

           有序集合中元素的排序规则又和列表中元素的排序规则不一样

1.将一个或多个元素添加到zset集合中:zadd zset  分数  值

        *如果元素以存在,则把分数覆盖

        

2.获取指定zset集合中指定下标区间的元素: zrange zset01 0 -1

        

 3.获取指定有序集合中,指定分数区间的元素:

                zrangebyscore key 最小分数  最大分数 [withscores显示分数]

                zrangebyscore zset01 20 40 withscores

                

4. 删除指定集合中一个或多个元素:zrem key 值

                zrem zset01 lisi wangwu

                

5.获取集合中所有元素的个数:zcard key

                

6.获取集合中分数在指定区间内的元素个数: zcount key min max

                

 7.获取集合中指定元素的排名(从0开始):zrank key 值

                

 8.获取集合中指定元素的分数:zscore key 元素值

                

Redis的配置文件

        redis根目录下提供redis.conf配置文件

        可以配置一些redis服务端运行的一些参数;

        如果不使用配置文件,redis会安装默认的参数运行

        如果使用配置文件,在启动redis服务时必须指定使用的配置文件

1.redis配置文件中关于网络的配置

        打开redis配置文件,在redis根目录下:vim redis.confg

        port:指定redis服务所使用的端口,默认使用6379

        bind:配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主

                   机上任何一个ip都可以,一般情况下都会配置一个真实ip。

        如果配置了port和bind,启动redis服务时必须使用:redis-server redis.confg &命令启动

        如果配置了port和bind,客户端连接redis服务时,必须指定端口和ip:redis-cli -h ip -p端口

        改了IP地址和端口,关闭redis服务时要指定ip和端口:redis-cli -h ip -p 端口

2.常规配置

        loglevel:配置日志级别,开发段配置为debug,上线阶段配置为notice

        logfile:指定日志文件,redis在运行过程中,会输出一些日志,默认输出到控制台,可以使用

                     logfile配置日志文件,是redis把日志信息输出到指定文件中。       

        databases:配置redis服务启动时创建数据库个数,默认是16个

3.安全配置

        requirepass:设置访问redis服务时所使用的密码,默认不使用

        此参数必须在protrcted-mode=yes时才起作用

        一旦设置了密码验证,客户端连接redis服务时,必须使用密码连接:

                redis-cli -h ip -p端口 -a 密码

Redis持久化

        redis提供持久化策略,在适当的时机采用适当的手段把内存中的数据持久化到磁盘中,每次redis服务启动时都可以把磁盘上的数据再次加载到内存中使用

1.RDB策略:在指定时间间隔内,redis服务执行指定次数的写操作,会触发一次持久化操作。

                       RDB策略是redis默认的持久化策略,redis服务启动时,默认就已经开启RDB策略。

                       dbfilename:Redis持久化数据生成的文件名,默认是dump.rdb,也可以自己配置。

                       dir:redis持久数据生成文件保存的目录,默认是./redis启动目录,也可以自己配置

                       如,下图RDB策略默认参数

 AOF策略:采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新执行一遍操

                    作日志中的指令。

                    效率低下,redis默认不开启AOF功能。

Redis的事务

        事务:把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,要么同时失败。

        redis事务:允许把一组redis命令放在一起执行,把命令进行序列化,然后一起执行,保证部

                             分原子性。

1.multi:用来标记一个事务的开始。如下图

             

2.exec:用来执行事务队列中所有的命令。如上图

3.redis的事务只能保证部分原子性,如果一组命令中,在压入队列过程中发生错误的命令,则本

        事务中所有的命令都不执行,能够保证事务的原子性。

4.如果一组命令中,压入队列过程中正常,但是在执行事务队列时发生了错误,则只会影响发生

        错误的命令,不会影响其他命令的执行,不能够保证事务的原子性。

5.discard:清除所有已经压入队列中的命令,并且结束整个事务

        

 6.watch:监控某一个key,当事务在执行过程中,此key得value值发生变化,则本事务放弃

                 执行,否则正常执行。

7.放弃监控所有的键:unwatch                 

watch version #监视
unwach  #放弃监视
multi   #开启事务
decrby balance 50 #-50
incrby balance2 50  #+50
exec  执行事务

redis主从复制

        主机数据跟新后根据配置和策略,自动同步到从机的master/slave机制,master以写为主,slave以读为主。

搭建一主二从redis集群:

1.搭建三台从redis服务,使用一个redis模拟三台redis服务

        提供三份redis配置文件:redis6379.conf    redis6380.conf  redis6381.conf

                修改三份配置文件:以redis6379.conf为例 ,修改一下配置参数              

 bind        127.0.0.1
 port        6379
 piddile     /var/run/redis_6379.pid
 logfil      "6379.log"
 dbfilename  dump6379.rdb

2.分别使用三个redis配置文件,启动三个redis服务

        redis-server redis6379.conf &

        redis-server redis6380.conf &

        redis-server redis6381.conf &

 3.通过redis客户端分别连接三台redis服务:

                redis-cli -h 127.0.0.1 -p 6379

                 redis-cli -h 127.0.0.1 -p 6380

                 redis-cli -h 127.0.0.1 -p 6381

4.查看三台redis服务在集群中的主从角色:

                info  replication

                默认,所有redis服务都是主机,即都能读和写,但都没有从机

                

5.设置主从关系:设从不设主

                6379为主机

               设置6380为从机,在6380端口客户端上执行命令:slaveof   主机ip  主机端口 

                

                 

                 在6381端口客户端也执行:slaveof 127.0.0.1 6379

                此时主机下已有两台从机,如下图

 

 以上就是主从设置,一旦设置完成,主机上的数据会复制到从机上

6.从机宕机,修复完成后连接redis服务会变成主机,必须重新设置主从关系

7.主机宕机,从机依旧可以读数据

8.从机上位

        原因:主机宕机,暂时无法恢复,需要找一个性能好的从机来当主机

        跟主机断开主从关系,断开之后从机就会变成主机,在从机上执行:slaveof no one

        

         重新设置主从关系,在从机上重新指定主机,执行命令:slaveof  主机ip  主机端口

   10.小结

        1)查看主从复制关系命令:info replication

        2)设置主从关系命令:slaveof 主机ip 主机端口

        3)断开主从关系:slaveof no one

Redis哨兵模式

        哨兵模式:主机宕机,从机上位自动版

1.搭建好一主二从集群架构

2.提供哨兵配置文件:

        在redis安装目录下创建配置文件:vim redis_sentinel.conf

        文件内容为:sentinel monitor dc-redis 127.0.0.1 6379 1

3.启动哨兵服务:redis-sentinel redis_sentinel.conf

4.主机宕机后,在恢复,自动成为新主机的从机。

5.小结

        1)查看主从复制关系命令:info replication

        2)设置主从关系命令:slaveof 主机ip 主机端口

        3)开启哨兵模式:redis-sentinel sentinel.conf

        4)主从复制原则:开始时全量复制,之后是增量复制

        5)哨兵模式三大任务:监控、提醒、自动故障迁移

Jedis

        java连接redis数据库

        1.创建maven项目,添加依赖

 <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>3.6.3</version>
    </dependency>

        2.创建创建jedis对象

                参数是:连接主机的ip和redis服务的端口

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐