热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis学习(一)基本操作

Redi



Redis

不停歇地提升自己


关注微信公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!




NoSQL数据库


特点

  • 不遵行SQL标准

  • 不支持ACID

  • 远超于SQL的性能

使用场景

  • 高并发的读写

  • 海量数据读写

  • 数据的高可扩展性

不适场景

  • 需要事务

  • 需要结构化查询,处理复杂关系




Redis数据库


一、特点

1、单线程+多路IO复用技术

  • 多路复用:使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就位,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启用线程执行(比如使用线程池)

  • 多路IO复用:做某件事情需要一定的时间,可以找一个中间人监视这件事,我们可以做其他的事。多路IO复用有select,poll,epoll这些模式。select监测数量能力有限。poll监测数量没有限制,但是需要一个一个核查。配epoll监测数量没有限制,也不需要一个一个核查,直接看是否有一个正确的标识。

  • 单线程:避免了线程切换、加锁等资源消耗


二、操作

1、Redis键的操作

  • keys *:查看当前库所有key(匹配:keys *1)

  • exists key:判断某个key是否存在

    • T:返回1

    • F:返回0

  • type key:查看key的类型

  • del key:删除指定的key

    • T:返回1

    • F:返回0

  • unlink key:根据value选择非阻塞删除,仅将keys从keyspace删除,后续再异步真正删除

  • expire key 10:设置10秒过期时间

  • ttl key:查看还有多就过期

    • 永不过期:-1

    • 已过期:-2

  • select:切换数据库

  • dbsize:查看当前数据库的key的数量

  • flushdb:清空当前库

  • flushall:通杀全部库


2、Redis字符串(String)

2.1、基本介绍

String是二进制安全的,意味着可以包含任意数据,是redis中的基本数据类型,一个字符串value最大512M


2.2、常用操作

  • set <key> <value>:添加新的key,value

  • get <key>:查询对应键值

  • append <key> <value>:将给定的<value>追加到原值末尾

    • 返回追加后的value长度

  • strlen <key>:获得值的长度

  • setnx <key> <value>:只有在key不存在时,设置key的值(原子操作)

    • 已存在:返回0

    • 不存在:返回1

  • incr <key>:将key中存储的数字值增1(原子操作)

  • decr <key>:将key中存储的数字值减1(原子操作)

  • incrby/decrby <key> <步长>

    • 将key中值自增减自定义步长

  • mset <key> <value> <key> <value>

    • 一次设置多个key value

  • mget <key> <key>:一次获取多个value

  • msetnx <key> <value> <key> <value>

    • 同时设置多个key value,当且仅当所有key都不存在,存在任何一个都失败

  • getrange <key> <start> <end>

    • 获取范围的值,字符串从start到end的字符,双闭区间

    • 例:"key"-"hello",getrange key 2 4,返回"llo"

  • setrange <key> <pose> <value>

    • 用value覆盖key所存储的字符串值,从pose开始

    • 例:"key"-"abcdefgh" setrange key 3 hell,新结果"abchellh"

  • setex <key> <time> <value>

    • 设置键值的同时设置过期时间time,单位秒

  • getset <key> <value>:以旧换新,设置新值时获得旧值

    • 返回旧值


2.3、特点

动态字符串的实现方式,采用预分配冗余空间的方式来减少内存频繁分配

        如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间。如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。


3、Redis列表(List)

3.1、基本介绍

        单键多值,简单的字符串列表,按照插入顺序排序,支持前插后插,底层是双向链表,对两端操作性能高,通过索引下标性能低


3.2、常用操作

  • lpush/rpush <key> <value1> <value2> <value3>

    • 从左边/右边插入一个或多个值。

    • 返回插入个数

  • lpop/rpop <key>:从左边/右边吐出一个值。值在键在,值光键亡。

  • rpop/lpush <key1> <key2>

    • <key1>列表右边吐出一个值,插到<key2>列表左边。

  • lrange <key> <start> <stop>

    • 按照索引下标获得元素(从左到右,-1指最后一个)

  • lindex <key> <index>:按照索引下标获得元素(从左到右)

  • llen <key>:获得列表长度

  • linsert <key> before <value> <newvalue>

    • <value>的后面插入<newvalue>插入值

  • lrem <key> <n> <value>:从左边删除n个value(从左到右)

  • lset <key> <index> <value>:将列表key下标为index的值替换成value


3.3、数据结构

List的数据结构为快速链表quickList。

        首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着—起存储,分配的是—块连续的内存。当数据呈比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。

4、Redis集合(Set)

4.1、基本介绍

        Redis set是可以自动排重的,并且Set提供了判断某个成员是否在一个Set集合内的重要接口。Redis的set是string类型的无序集合。它底层其实是一个value为null的hash表。所以添加,删除,查找的复杂度都是O(1)。


4.2、常用操作

  • sadd <key> <value1> <value2>:将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略。

  • smembers <key>:取出该集合的所有值。

  • sismember <key> <value>:判断集合<key>是否为含有该

    • T:返回1

    • F:返回0

  • scard <key>:返回该集合的元素个数。

  • srem <key> <value1> <value2>:删除集合中的某个元素。

  • spop <key>:随机从该集合中吐出一个值,会删除

  • srandmember <key> <n>随机从该集合中取出n个值。不会从集合中删除

  • smove <source> <destination> <value>:

    • 把集合中一个值从一个集合移动到另一个集合

  • sinter <key1> <key2>:返回两个集合的交集元素。

  • sunion <key1> <key2>:返回两个集合的并集元素。

  • sdiff <key1> <key2>:返回两个集合的差集元素(key1中的,不包含key2中的)


4.3、数据结构

Set数据结构是dict字典,字典使用哈希表实现的


5、Redis哈希(Hash)

5.1、基本介绍

Redis hash是一个键值对集合。        Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息


5.2、常用操作

  • hset <key> <field> <value>:给<key>集合中的<field>键赋值<value>

  • hget <key1> <field>:从<key1>集合<field>取出value

  • hmset <key1> <field1> <valuel> <field2> <value2>

    • 批量设置hash的值

  • hexists <key1> <field>:查看哈希表key中,给定域field是否存在。

    • 存在:返回1

    • 不存在:返回0

  • hkeys <key>:列出该hash集合的所有field

  • hvals <key>:列出该hash集合的所有value

  • hincrby <key> <field> <increment>

    • 为哈希表key中的域field的值加上增量<increment>,支持正负

  • hsetnx <key> <field> <value>

    • 将哈希表key中的域field的值设置为 value,当且仅当域field不存在

    • 已存在插入失败:返回0

    • 不存在插入成功:返回1


5.3、数据结构

        Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。


6、Redis有序集合(Zset)

6.1、基本介绍

        Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score ) ,这个评分( score )被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。因为元素是有序的,所以你也可以很快的根据评分( score ) 或者次序( position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。


6.2、常用操作

  • zadd <key> <score1> <value1> <score2> <value2>

    • 将一个或多个member元素及其score值加入到有序集key当中。

  • zrange <key> <start> <stop> [WITHSCORES]

    • 返回有序集 key中,下标在<start> <stop>之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集。

  • zrangebyscore key min max [ withscores] [limit offset count]

    • 返回有序集 key中,所有score值介于min和max之间(包括等于min或max )的成员。有序集成员按score值递增(从小到大)次序排列。

  • zrevrangebyscore key max min [withscores] [limit offset count]

    • 同上,改为从大到小排列。

  • zincrby <key> <increment> <value>

    • 为value元素的score加上增量

  • zrem <key> <value>:删除该集合下,指定value值的元素

  • zcount <key> <min> <max>:统计该集合,分数区间内的元素个数

  • zrank <key> <value>:返回value值在集合中的排名,从0开始


6.3、数据结构

        Zset是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。Zset底层使用了两个数据结构(1) hash:hash的作用就是关联元素value和权重score,保障元素value的唯—性,可以通过元素value找到相应的score值。(2)跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表,用于快速的查找到目标元素。


7、Redis位操作(Bitmaps)

7.1、基本介绍

        本身不是一种数据类型,实际上就是字符串,但可以对字符串进行位操作,其中以0和1进行存储。可以想象成一个以位为单位的数组,数组下标叫偏移量。


7.2、常用操作

  • setbit <key> <offset> <value>:设置Bitmaps中某个偏移量的值

  • getbit <key> <offset>:获取Bitmaps中某个偏移量的值

  • bitcount <key> [start end]:返回从start到end中位为1的数量

  • bitop and(or/not/xor) <newmap> <bitmap1> <bitmap2>

    • 对Bitmaps进行与或非异或操作,返回结果数量


8、基数(HyperLogLog)

8.1、基本介绍

        用于做基数统计的算法,每个HyperLogLog键只需要花费12KB内存就可计算接近2^64个不同元素的的基数。基数为不重复元素、如数据集{1,3,5,7,5,7,8},基数集为{1,3,5,7,8},基数为5。


8.2、常用操作

  • pfadd <key> <value1> <value2>:向HLL中加入值

    • 不存在加入成功:返回1

    • 已存在加入失败:返回0

  • pfcount <key1> <key2>:计算HLL的近似基数,可以计算多个HLL,返回合并后的结果

  • pfmerge <newkey> <key1> <key2>

    • 将一个或多个HLL合并后的结果存储到newkey中


9、Redis经纬度(Geospatial)

9.1、基本介绍

        Redis 3.2中增加了对GEO类型的支持。GEO ,Geographic,地理信息的缩写。该类型,就是元素的⒉维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。

9.2、常用操作

  • geoadd <key> <longitude> <latitude> <value>

    • 添加key集合下value地点的经度、纬度。

    • 有效经度从-180到180,有效维度从-85.05112878到85.05112878,不包括南北极,若超出返回错误

    • 已经添加的元素无法再次添加

  • geopos <key> <value>:根据名称取坐标位置

  • geodist <key> <value1> <value2> [m|km|ft|mi]

    • 获取两个位置之间的直线距离,可加单位

  • georadius <key> <longitude> <latitude> radius m|km|ft|mi

    • 以给定经纬度为中心,找出某一半径内的元素






关注微信公众号:夜寒信息

致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!



点个在看你最好看






推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • MySQL笔记_MySQL笔记1|数据库17问17答
    本文由编程笔记#小编为大家整理,主要介绍了MySQL笔记1|数据库17问17答相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
朴子字軒_755
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有