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、特点

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

Redis学习(一)基本操作_字符串

        如图中所示,内部为当前字符串实际分配的空间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。

Redis学习(一)基本操作_redis_02

        首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是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>是否为含有该<value>
  • 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<String.Object>用户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<String,Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。Zset底层使用了两个数据结构(1) hash:hash的作用就是关联元素value和权重score,保障元素value的唯—性,可以通过元素value找到相应的score值。(2)跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表,用于快速的查找到目标元素。

Redis学习(一)基本操作_redis_03


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

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






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

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