Redis进阶实践之五Redis的高级特性

一、引言

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

二、Redis的高级特性

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

  1、通用命令:

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

           192.168.127.128:6379>keys *
           1"name"
           2set23set1"

           6379>keys n*
           6379>keys s*
           6379>keys set?
           6379>keys n?me
           "


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

           age6379>exists name age address(该值存在)
           (integer)2

           exists name1 age1 address(该值存在)
           (integer)0


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

           6379>expire name 60 设置name过期时间为60秒
           (integer)1

           50 设置name过期时间为50秒
           (integer)ttl name
           (integer)48

           45

            ttl返回值:

              -1、过期时间不存在

              -2、过期操作成功,数据已经移除


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

           persist name
           (integer)1 //成功取消设置的过期策略

           0 上一步已经取消了,在此执行取消操作返回0。


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

           select 
           OK

           6379[1]>

           1]>55]>


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

           索引为0的数据库
           "

           索引为5的数据库
           5]>keys *
           (empty list or set)

           在索引为5的数据库里面增加sex键值对,然后把其移动到索引为0的数据库
           5]> sex nan
           OK

           5]>keys *
           1)sex5]>move sex 0
           (integer)1

           "    从索引为5的数据已经移动到了索引为0的数据库
           "


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

           randomkey
           "


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

           rename name name1
           OK

           name1rename name1 name
           OK

 


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

           echo patrickLiu
           patrickLiu"


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

           dbsize
           3


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

           6379>info 显示当前数据的所有数据


           6379>info replication 显示指定节的信息
           # Replication

           role:master
           connected_slaves:
           ...


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

           6379>config get *
           ...

           get bind
           bind192.168.127.128 port
           port6379"


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

           flushdb
           OK

           6379>keys *set)


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

           flushall
           OK


           1]>keys *)

           ...

           )

           ...


  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 127.128 -p 6379

           
           (error)NOAUTH Authentication required.

           6379>auth admin   授权
            OK

           6379>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命令执行事务。

           当前数据库中无值
           )


           multi
           OK

           set p1 
           QUEUED

           set p2 2set p3 3exec
           )OK
           )OK

           p32)p23)p1"


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

           当前数据库中的值
           set p4 4set p5 6379>discard  取消事务
           OK

           值没变
           "


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

            name
           huangfeihong age
           (integer)18

           incr name
           QUEUED

           incr age
           QUEUED

           1)(error)ERR value is not an integer or out of range
           2)(integer)19

           " 姓名没有改变

           19  当前年龄已经修改


      再次强调,在真正的产品环境中,要特别注意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 ...],进行订阅监听,可以接受来之发布端的消息了。可以定义多个频道,这个频道的名称是自己可以定义的。

           subscribe c1 c2
           Reading messages...(press Ctrl-C quit)         
           subscribec13)(integer)1
           c22
           接受的到的消息
           messageredishello处于等待状态,可以接收消息了


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

           publish c1 hello
           (integer)1  发布消息成功

           publish c2 redis
           (integer)发布消息成功


三、总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc