一、引言

上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握。今天我们开始介绍一些Redis的高级特性,虽然有些命令很简单,但是这些命令是使用很广泛的,并且是通用的一些命令,好好的把握这些命令,通过组合这些命令可以完成比较复杂的任务,这都是基础,我们就开始我们今天的学习之旅吧。

二、Redis的高级特性

下面我们就是Redis高级特性的每个知识点,只是个人的理解,随着学习的深入,也会更新相关的章节。

  1、通用命令:

    1.1】、语法:keys pattern,pattern可以是类似正则的匹配规则,可以是*,也可以是?,返回匹配规则的键值key的列表。

           192.168.127.128:>keys *
)"name"
)"set2"
)"set1" 192.168.127.128:>keys n*
)"name" 192.168.127.128:>keys s*
)"set2"
)"set1" 192.168.127.128:>keys set?
)"set2"
)"set1" 192.168.127.128:>keys n?me
)"name"

    1.2】、语法:exists key [key ...],判断一个或者多个key是否存在,并返回存在key的个数,不存在返回0。

           192.168.127.128:>keys *
)"name"
)"age" 192.168.127.128:>exists name age address(该值存在)
(integer) 192.168.127.128:>exists name1 age1 address(该值存在)
(integer)

    1.3】、语法:expire key seconds,给指定的key设置过期时间,单位是秒。用ttl命令可以查看剩余的时间,如果想更精确的、性能更好的倒计时功能,可以使用该功能。设置过期时间成功返回值为1,此命令可以多次执行,后面的过期值会覆盖前面的过期值。过期的数据会从Redis数据库里删除。

           192.168.127.128:>expire name  设置name过期时间为60秒
(integer) 192.168.127.128:>expire name 设置name过期时间为50秒
(integer) 192.168.127.128:>ttl name
(integer) 192.168.127.128:>ttl name
(integer) ttl返回值: -、过期时间不存在 -、过期操作成功,数据已经移除

    1.4】、语法:persist key,取消已经设置了过期时间的key的过期策略。取消过期策略成功返回1,key没有过期策略返回0。

           192.168.127.128:>keys *
)"name"
)"age" 192.168.127.128:>expire name 设置name过期时间为60秒
(integer) 192.168.127.128:>persist name
(integer) //成功取消设置的过期策略 192.168.127.128:>persist name
(integer) //上一步已经取消了,在此执行取消操作返回0。

    1.5】、语法:select index,在Redis中,逻辑划分为16个数据库,索引从0-15,我们在使用的过程中,可以针对不同的业务逻辑把数据缓存在不同的数据库,这是一个很好的架构设计,切记不要把所有的数据放在0号数据库里,不便于管理和分类。这16个数据库数据是分离的,不是共享的,或者说数据都是独立的。

           192.168.127.128:>select
OK 192.168.127.128:[]> 192.168.127.128:[]>select
OK 192.168.127.128:[]>

    1.6】、语法:move key db,至指定名称为key的键值对转移到指定数据库db里面,db是数据下标索引。

           //索引为0的数据库
192.168.127.128:>keys *
)"name"
)"age" //索引为5的数据库
192.168.127.128:[]>keys *
(empty list or set) //在索引为5的数据库里面增加sex键值对,然后把其移动到索引为0的数据库
192.168.127.128:[]>set sex nan
OK 192.168.127.128:[]>keys *
)"sex" 192.168.127.128:[]>move sex
(integer) //索引为0的数据库
192.168.127.128:>keys *
)"name"
)"sex" //从索引为5的数据已经移动到了索引为0的数据库
)"age"

    1.7】、语法:randomkey,随机返回当前数据库中的key,其实这个功能我们可以使用在抽奖的场景,如果在并发比较高,而且有要保证性能的情况下,我建议大家使用Redis的这个功能来完成抽奖的功能。有时候会返回重复的值,如果做抽奖需要做处理一下。

           192.168.127.128:>keys *
)"name"
)"sex"
)"age" 192.168.127.128:>randomkey
"name" 192.168.127.128:>randomkey
"age" 192.168.127.128:>randomkey
"age"

    1.8】、语法:rename key newkey,重新给指定的key命名。

           192.168.127.128:>keys *
)"name"
)"sex"
)"age" 192.168.127.128:>rename name name1
OK 192.168.127.128:>keys *
)"name1"
)"sex"
)"age" 192.168.127.128:>rename name1 name
OK

    1.9】、语法:echo message,在当前介质上打印message信息。

           192.168.127.128:>echo patrickLiu
"patrickLiu"

    1.10】、语法:dbsize,返回当前数据中键值对的个数,或者更准确的说是key的个数。

           192.168.127.128:>keys *
)"name"
)"sex"
)"age" 192.168.127.128:>dbsize

    1.11】、语法:info [section],可以获取当前数据的详细信息。

           192.168.127.128:>info //显示当前数据的所有数据

           192.168.127.128:>info replication //显示指定节的信息
# Replication role:master
connected_slaves:
...

    1.12】、语法:config get *,获取配置文件中的所有的配置数据。

           192.168.127.128:>config get *
... 192.168.127.128:>config get bind
)"bind"
)"192.168.127.128" 192.168.127.128:>config get port
)"port"
)""

    1.13】、语法:flushdb,清空当前数据所有的键值对。

           192.168.127.128:>flushdb
OK 192.168.127.128:>keys *
(empty list or set)

    1.14】、语法:flushall,清空所有数据库的所有键值对。

           192.168.127.128:>flushall
OK 192.168.127.128:[]>keys *
(empty list or set) ... 192.168.127.128:[]>keys *
(empty list or set) ...

  2、安全设置

2.1】、vi 或者 vim 编辑 redis.conf 文档,修改
     
          #requirepass 123456 (设置密码)
          
           requirepass admin

   2.2】、重启服务器 pkill redis-server

           [root@linux~]# application/program/redis-tool/redis-cli -h 192.168.127.128 -p 

           192.168.127.128:>keys *
(error)NOAUTH Authentication required. 192.168.127.128:>auth admin //授权
OK 192.168.127.128:>keys * //可以执行
(empty list or set)

2.3】、[root@linux~]/root/application/program/redis-tool/redis-cli -h 192.168.127.128 -p 6379 -a admin

  3、事务模型

redis也是支持事务的,但是这个事务是比较简单的,之所以说简单,是因为redis的事务不能保证操作的同时成功或者同时失败而进行提交或者回滚,这种情形很容易导致数据的不一致性,大家使用的时候要特别注意。

     3.1】、首先通过multi命令开启事务,然后进行事务性的设置,这些设置完的数据会存储在虚拟队列中,最后可以通过exec命令执行事务。

           //当前数据库中无值
192.168.127.128:>keys *
(empty list or set) 192.168.127.128:>multi
OK 192.168.127.128:>set p1
QUEUED 192.168.127.128:>set p2
QUEUED 192.168.127.128:>set p3
QUEUED 192.168.127.128:>exec
)OK
)OK
)OK 192.168.127.128:>keys *
)"p3"
)"p2"
)"p1"

  3.2】、redis的事务可以通过discard命令取消事务。

           //当前数据库中的值
192.168.127.128:>keys *
)"p3"
)"p2"
)"p1" 192.168.127.128:>multi
OK 192.168.127.128:>set p4
QUEUED 192.168.127.128:>set p5
QUEUED 192.168.127.128:>discard //取消事务
OK //值没变
192.168.127.128:>keys *
)"p3"
)"p2"
)"p1"

   3.3】、特别注意redis事务的不一致性。

           //当前数据库中的值
192.168.127.128:>keys *
)"age"
)"name" 192.168.127.128:>get name
"huangfeihong" 192.168.127.128:>get age
(integer) 192.168.127.128:>multi
OK 192.168.127.128:>incr name
QUEUED 192.168.127.128:>incr age
QUEUED 192.168.127.128:>exec
)(error)ERR value is not an integer or out of range
)(integer) 192.168.127.128:>get name
"huangfeihong" //姓名没有改变 192.168.127.128:>get age
(integer) //当前年龄已经修改

再次强调,在真正的产品环境中,要特别注意Redis事务的这个特点,或者说是弊端,不能保证数据的一致性。

  4、持久化

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化。Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。所以来说,总结起来,Redis的数据持久化就有两种方式。

4.1】、第一种方法filesnapshotting(rdb):默认redis是会以快照的形式将数据持久化到磁盘的(一个二进制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N(秒数) M(改变的个数),表示在N秒之内,redis至少发生M次修改,redis才生成快照并持久化到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照。该模式无论怎么设置,都会产生时间间隔,如果在这时间间隔断电,数据还是会丢失,会对数据持久化产生不利的影响,在实际的生产环境中,不建议使用该模式。

save 900 1     900秒内有超过1个的key值被修改了就发起快照保存

save 300 30    300秒内有超过30个的key值被修改了就发起快照保存

save 60  10000 60秒内有超过10000个的key值被修改了就发起快照保存

  4.2】、第二种方法是Append-only-file(aof):Append-only方法可以做到全部数据不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中开启,默认是不打开AOF功能的(appendonly no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到redis关闭前的最后时刻。

appendfsync有三个选项:always、everysec和no:

         1、always:服务器会在每执行一个事件就把AOF缓冲区的内容强制性的写入硬盘上的AOF文件里,可以看成你每执行一个redis写入命令就往AOF文件里记录这条命令,这保证了数据持久化的完整性,但效率是最慢的,却也是最安全的;

         2、everysec:服务端每执行一次写操作也会把该条命令追加到一个单独的AOF缓冲区的末尾,并将AOF缓冲区写入AOF文件,然后每隔一秒才会进行一次文件同步把内存缓冲区里的AOF缓存数据真正写入AOF文件里,这个模式兼顾了效率的同时也保证了数据的完整性,即使在服务器宕机也只会丢失一秒内对redis数据库做的修改;

3、no:你完全可以接受Redis数据的丢失,它虽然也会把每条写命令追加到AOF缓冲区的末尾,然后写入文件,但什么时候进行文件同步真正把数据写入AOF文件里则由系统自身决定,即当内存缓冲区的空间被填满或者是超过了设定的时限后系统自动同步。这种模式下效率是最快的,但对数据来说也是最不安全的,如果redis里的数据都是从后台数据库如mysql中取出来的,属于随时可以找回或者不重要的数据,那么可以考虑设置成这种模式。

[root@linux~]# more application/program/redis-tool/redis.conf
        dir "/root/application/program/redis-tool/datas/"           #AOF或者RDB文件存放目录
        appendonly yes                       #启用AOF持久化,默认关闭,RDB模式就关闭了,两者是二选一的情况
        appendfilename "appendonly.aof"      #AOF持久化的文件名称(默认)
        appendfsync no                       #AOF持久化的策略
        auto-aof-rewrite-percentage 100      #触发AOF文件重写的条件(默认)
        auto-aof-rewrite-min-size 64mb       #触发AOF文件重写的条件(默认)

  5、发布订阅

Redis的这个发布订阅功能有点类似MQ(消息队列)功能,但是这功能不能滥用,它的使用场景非常有限,并且数据量也不能太大。比如:成千上万条的数据场景是可以满足的,如果订阅和发布的数据量超过N万、十万、千万或者亿级别,这样的场景就很难满足了,到那时候我们就需要使用真正的MQ来满足该功能了。

5.1】、语法:subscribe channel [channel ...],进行订阅监听,可以接受来之发布端的消息了。可以定义多个频道,这个频道的名称是自己可以定义的。

           192.168.127.128:>subscribe c1 c2
Reading messages...(press Ctrl-C quit)
)"subscribe"
)"c1"
)(integer)
)"subscribe"
)"c2"
)(integer)
//接受的到的消息
)"message"
)"c2"
)"redis" )"message"
)"c1"
)"hello" //处于等待状态,可以接收消息了

5.2】、语法:publish channel message,针对指定的消息频道发布消息,订阅端就可以接受到消息了。

           192.168.127.128:>publish c1 hello
(integer) //发布消息成功 192.168.127.128:>publish c2 redis
(integer) //发布消息成功

三、总结

随着学习的深入,理解的越来越全面和深刻了,以前很多联系不起来的知识点都联系起来了,以后还需继续努力,如果有了新的学习心得,还会持续更新相关的章节。随着学习的继续,也让自己养成学习的习惯。努力吧!!!!

Redis进阶实践之五Redis的高级特性的更多相关文章

  1. Redis进阶实践之五Redis的高级特性(转载 5)

    Redis进阶实践之五Redis的高级特性 一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今 ...

  2. Redis进阶实践之四Redis的基本数据类型(转载4)

    Redis进阶实践之四Redis的基本数据类型 一.引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软 ...

  3. Redis进阶实践之七Redis和Lua初步整合使用(转载 7)

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  4. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)

    Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...

  5. Redis进阶实践之四Redis的基本数据类型

    一.引言    今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软件使用的更频繁,适用范围更广呢?就是因为R ...

  6. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务

    一.引言 今天本来没有打算写这篇文章,当初我感觉使用这个工具应该很简单,下载的过程也不复杂,也没有打算记录下来.但是在使用的过程中还是出现了一些问题,为了给第一次使用Redis Desktop Man ...

  7. Redis进阶实践之七Redis和Lua初步整合使用

    一.引言        Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当 ...

  8. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  9. Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装(转载)(1)

    Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装 一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇 ...

随机推荐

  1. UWP Windows历史上最漂亮的UWP框架出炉!!!

    UWP Windows历史上最漂亮的UWP框架出炉!!! 本框架基于微软的开源项目WTS开发,并在其基础上增加了FDS(流畅设计元素,高光.亚克力等).多语言系统.沉浸式体验(扩展内容到标题栏) 同时 ...

  2. QT中几个函数的使用方法

    一.把字符串转换成整形demo1:QString str = "FF";bool ok;int hex = str.toInt(&ok, 16); // hex == 25 ...

  3. Web API系列之三 基本功能实现

    Web API系列之二讲解了如何搭建一个WebApi的基架,本文主要在其基础之上实现基本的功能.下面开始逐步操作: 一.配置WebApi的路由-用于配置外部如何访问内部资源的url的规则 1.添加Gl ...

  4. ubuntu14 搭建单机版hadoop2.6

    1. 如果你的集群尚未安装所需软件,你得首先安装它们. 以Ubuntu Linux为例: $ sudo apt-get install ssh $ sudo apt-get install rsync ...

  5. .net 框架

    目录 API 应用框架(Application Frameworks) 应用模板(Application Templates) 人工智能(Artificial Intelligence) 程序集处理( ...

  6. NPOI 1.2 教程

    NPOI 1.2 教程官方地址 很多人可能对NPOI还很陌生,别担心,通过本教程你将对NPOI有进一步的认识和理解. 目录 1. 认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 ...

  7. 利用appium-1.5.3.dmg安装Appium. doctors时,提示 Could not detect Mac OS X Version from sw_vers output: '10.12'

    发生这种错误的原因是因为:appium不支持mac 10.12版本. 解决方法: https://stackoverflow.com/questions/40129794/how-to-fix-err ...

  8. 常用数学符号的 LaTeX 表示方法

    常用数学符号的 LaTeX 表示方法 (以下内容主要摘自"一份不太简短的 LATEX2e 介绍") 1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(square ...

  9. while循环写3次用户名密码验证程序

    #变量来自原始用户名和密码 username = 'admin' password = 'nimda' #变量来自计数器 count = 0 #循环条件计数器小于3,则执行while代码块 while ...

  10. 定义一个数,它可能为正 也可能为负 var num = Math.pow(-1,parseInt(Math.random() * 2) + 1);

    // 定义一个随机数范围从0 ~页面宽度 var x = parseInt(Math.random() * myCanvas.width); // 定义一个随机数 范围从0 ~页面高度 var y = ...