zoukankan      html  css  js  c++  java
  • Redis基础类型

    Redis是什么

    Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。从2015年6月开始,Redis的开发由Redis Labs赞助,而2013年5月至2015年6月期间,其开发由Pivotal赞助。[1]在2013年5月之前,其开发由VMware赞助。[2][3]根据月度排行网站DB-Engines.com的数据显示,Redis是最流行的键值对存储数据库。

    许多语言都包含Redis支持,包括:Java、C、C++、Erlang、Python、Ruby等等。

    Redis支持的数据类型

    • String———-字符串
    • Hash————字典
    • List————-列表
    • Set————–集合
    • Sorted Set——有序集合

    String—字符串

    String是Redis最基本的类型,虽然号称String,但是它是key-value型的。String类型是二进制安全的, 支持字符串、整数、浮点数。比如jpg图片或者序列化的对象 ,也可以包含数字,String一个键最大能存储512MB。String相关的命令有:

    SET key value                   设置key=value
    SETNX key value                 设置键的值,只有当该键不存在
    SETEX key seconds value         键到期时设置值
    SETRANGE key offset value       覆盖字符串的一部分从指定键的偏移
    GET key                         或者键key对应的值
    GETRANGE key start end          得到字符串的子字符串存放在一个键
    GETSET key value                设置键的字符串值,并返回旧值
    MGET key1 [key2..]              得到所有的给定键的值
    GETBIT key offset               返回存储在键位值的字符串值的偏移
    SETBIT key offset value         设置或清除该位在存储在键的字符串值偏移
    STRLEN key                      得到存储在键的值的长度
    MSET key value [key value...]   设置多个键和多个值
    MSETNX key value [key value...] 设置多个键多个值,只有在当没有按键的存在时
    PSETEX key milliseconds value   设置键的毫秒值和到期时间
    INCR key                        增加键的整数值一次
    INCRBY key increment            由给定的数量递增键的整数值
    INCRBYFLOAT key increment       由给定的数量递增键的浮点值
    DECR key                        递减键一次的整数值
    DECRBY key decrement            由给定数目递减键的整数值
    APPEND key value                追加值到一个键

    其中用于操作管理键的命令有:

    DEL key                         如果存在删除键
    DUMP key                        返回存储在指定键的值的序列化版本
    EXISTS key                      此命令检查该键是否存在
    EXPIRE key seconds              指定键的过期时间
    EXPIREAT key timestamp          指定的键过期时间。在这里,时间是在Unix时间戳格式
    PEXPIRE key milliseconds        设置键以毫秒为单位到期
    PEXPIREAT key milliseconds-timestamp        设置键在Unix时间戳指定为毫秒到期
    KEYS pattern                    查找与指定模式匹配的所有键
    MOVE key db                     移动键到另一个数据库
    PERSIST key                     移除过期的键
    PTTL key                        以毫秒为单位获取剩余时间的到期键。
    TTL key                         获取键到期的剩余时间。
    RANDOMKEY                       从Redis返回随机键
    RENAME key newkey               更改键的名称
    RENAMENX key newkey             重命名键,如果新的键不存在
    TYPE key                        返回存储在键的数据类型的值。

    List(列表)

    Redis列表是简单的字符串列表,可以类比到Java中的List,简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。列表的最大长度为2^32 - 1,也即每个列表支持超过40亿个元素。

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

    应用场景

    Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者push,消费者pop/bpop。

    相关命令

    BLPOP key1 [key2 ] timeout              移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    BRPOP key1 [key2 ] timeout              移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    BRPOPLPUSH source destination timeout   从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    LINDEX key index                        通过索引获取列表中的元素
    LINSERT key BEFORE|AFTER pivot value    在列表的元素前或者后插入元素
    LLEN key                                获取列表长度
    LPOP key                                移出并获取列表的第一个元素
    LPUSH key value1 [value2]               将一个或多个值插入到列表头部
    LPUSHX key value                        将一个值插入到已存在的列表头部
    LRANGE key start stop                   获取列表指定范围内的元素
    LREM key count value                    移除列表元素
    LSET key index value                    通过索引设置列表元素的值
    LTRIM key start stop                    对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
    RPOP key                                移除并获取列表最后一个元素
    RPOPLPUSH source destination            移除列表的最后一个元素,并将该元素添加到另一个列表并返回
    RPUSH key value1 [value2]               在列表中添加一个或多个值
    RPUSHX key value                        为已存在的列表添加值

    Hash(字典,哈希表)

    类似Java中的HashMap类型。

    Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

    应用场景

    假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。

    相关命令

    HDEL key field1 [field2]    删除一个或多个哈希表字段
    HEXISTS key field   查看哈希表 key 中,指定的字段是否存在。
    HGET key field  获取存储在哈希表中指定字段的值。
    HGETALL key     获取在哈希表中指定 key 的所有字段和值
    HINCRBY key field increment     为哈希表 key 中的指定字段的整数值加上增量 increment 。
    HINCRBYFLOAT key field increment    为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
    HKEYS key   获取所有哈希表中的字段
    HLEN key    获取哈希表中字段的数量
    HMGET key field1 [field2]   获取所有给定字段的值
    HMSET key field1 value1 [field2 value2 ]    同时将多个 field-value (域-值)对设置到哈希表 key 中。
    HSET key field value    将哈希表 key 中的字段 field 的值设为 value 。
    HSETNX key field value  只有在字段 field 不存在时,设置哈希表字段的值。
    HVALS key   获取哈希表中所有值
    HSCAN key cursor [MATCH pattern] [COUNT count]  迭代哈希表中的键值对。

    Set(集合)

    可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。

    set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

    应用场景

    Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

    又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。

    SADD key member1 [member2]  向集合添加一个或多个成员
    SCARD key   获取集合的成员数
    SDIFF key1 [key2]   返回给定所有集合的差集
    SDIFFSTORE destination key1 [key2]  返回给定所有集合的差集并存储在 destination 中
    SINTER key1 [key2]  返回给定所有集合的交集
    SINTERSTORE destination key1 [key2]     返回给定所有集合的交集并存储在 destination 中
    SISMEMBER key member    判断 member 元素是否是集合 key 的成员
    SMEMBERS key    返回集合中的所有成员
    SMOVE source destination member      member 元素从 source 集合移动到 destination 集合
    SPOP key    移除并返回集合中的一个随机元素
    SRANDMEMBER key [count]     返回集合中一个或多个随机数
    SREM key member1 [member2]  移除集合中一个或多个成员
    SUNION key1 [key2]  返回所有给定集合的并集
    SUNIONSTORE destination key1 [key2]     所有给定集合的并集存储在 destination 集合中
    SSCAN key cursor [MATCH pattern] [COUNT count]  迭代集合中的元素

    Sorted Set(有序集合)

    Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序。

    Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为2^32- 1元素(4294967295,超过40亿每个元素的集合)。

    Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

    使用场景

    Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

    又比如用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。

    ZADD key score1 member1 [score2 member2]    向有序集合添加一个或多个成员,或者更新已存在成员的分数
    ZCARD key   获取有序集合的成员数
    ZCOUNT key min max  计算在有序集合中指定区间分数的成员数
    ZINCRBY key increment member    有序集合中对指定成员的分数加上增量 increment
    ZINTERSTORE destination numkeys key [key ...]   计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
    ZLEXCOUNT key min max   在有序集合中计算指定字典区间内成员数量
    ZRANGE key start stop [WITHSCORES]  通过索引区间返回有序集合成指定区间内的成员
    ZRANGEBYLEX key min max [LIMIT offset count]    通过字典区间返回有序集合的成员
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]  通过分数返回有序集合指定区间内的成员
    ZRANK key member    返回有序集合中指定成员的索引
    ZREM key member [member ...]    移除有序集合中的一个或多个成员
    ZREMRANGEBYLEX key min max  移除有序集合中给定的字典区间的所有成员
    ZREMRANGEBYRANK key start stop  移除有序集合中给定的排名区间的所有成员
    ZREMRANGEBYSCORE key min max    移除有序集合中给定的分数区间的所有成员
    ZREVRANGE key start stop [WITHSCORES]   返回有序集中指定区间内的成员,通过索引,分数从高到底
    ZREVRANGEBYSCORE key max min [WITHSCORES]   返回有序集中指定分数区间内的成员,分数从高到低排序
    ZREVRANK key member     返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
    ZSCORE key member   返回有序集中,成员的分数值
    ZUNIONSTORE destination numkeys key [key ...]   计算给定的一个或多个有序集的并集,并存储在新的 key 中
    ZSCAN key cursor [MATCH pattern] [COUNT count]  迭代有序集合中的元素(包括元素成员和元素分值)

    参考链接

    1. Redis常用数据类型介绍、使用场景及其操作命令
    2. Redis在线命令尝试
    3. 菜鸟学院
  • 相关阅读:
    Python3.4的Pillow库实现验证码图片
    希尔排序
    二分法排序
    [算法天天练]选择排序
    冒泡 [Python]
    python -- 结构数据类型(列表、元组、集合、字典)
    python -- 字符串操作
    python -- 基础语法
    python -- 环境搭建
    Unittest方法 -- 以test开头实例
  • 原文地址:https://www.cnblogs.com/alcc/p/9201877.html
Copyright © 2011-2022 走看看