Redis入门指南-笔记-数据类型
3.1 入门
KEYS pattern 获取符合规则的键名列表
pattern支持glob风格通配符格式
?:匹配一个字符
* :匹配任意个(包括0个)字符
[]:匹配括号间的任一字符,可以使用“-”符号表示一个范围,eg:a[b-d]可以匹配“ab”、"ac"和“ad”
\x:匹配字符x,用于转义符号。如要匹配“?”就需要使用\?
SET命令建立一个名为keyname的键:
redis>SET bar 1
EXISTS key 判断一个键key是否存在
DEL key 删除键
TYPE key 获得键值的数据类型
返回类型可能为string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)和zset(有序集合类型)
LPUSH keyname 向指定的列表类型键中增加一个元素,如果键不存在则创建它
3.2 字符串类型
(1) 能存储任何形式的字符串,包括二进制数据。可以存放用户的邮箱,JSON化的对象甚至是一张图片。
(2) 允许存储的数据的最大容量是512MB
命令:
1.赋值与取值 SET key value
GET key 当键不存在时会返回空结果
赋多个值/取多个值 MSET
MGET
2.递增/递减数字 INCR/DECR key(key中存储的字符串是整数形式)
当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1
当键不是整数时会提示错误
包括INCR在内的所有Redis命令都是原子操作
增加指定一次增加的数值: INCRBY key 2
DECRBY key 3
3. 向尾部追加值
APPEND key value
APPEND作用是向键值的末尾追加value。如果键值不存在,则将该键的值设置为value,即相当于SET key value。返回值 是追加后字符串的总长度。
redis>SET key hello
OK
redis>APPEND key " world!"
(integer) 12
此时key的值是“hello world!”
4.获取字符串长度
STRLEN key
5.位操作
GETBIT key offset:获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始
如果需要获取的二进制位的索引超出了键值的二进制位的实际长度则默认位值是0
SETBIT key offset value:可以设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值
如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将中间的二进制位设置为0,同 理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0
BITCOUNT foo:可以将获得字符串类型键中值是1的二进制位的个数
foo = "aar"
redis>SETBIT foo
(integer) 10
可以通过参数来限制统计的字节范围,例如我们只希望统计前两个字节(即‘aa’):
redis>BITCOUNT foo 0 1
(integer) 6
BITOP:可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键中。
BITOP支持的运算操作有AND、OR、XOR、和NOT
redis>BITOP OR res foo1 foo2
6.字符串类型数据的应用:
(1) 文章访问量统计
命名一个键:对象类型:对象ID:对象属性
user:1:friends来存储ID为1的用户的好友列表
(2) 生成自增ID
对于每一类对象使用名为对象类型(复数形式):count的键(如users:count)来存储当前类型对象的数量,每增加一个新对象 时都使用INCR命令递增该键的值。
(3) 存储文章数据
每个字符串类型键只能存储一个字符串,而一篇博客文章由标题、正文、作者与发布时间等多个元素构成。为了存储这些元 素,我们需要使用序列化函数将他们转换成一个字符串。
3.3 散列类型
散列(hash)类型的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型。一个散列类型键可以包含至多2(32)-1个字段;
关系型数据库是以二维表的形式存储的,这就要求所有的记录都拥有同样的属性,无法单独为某条记录增减属性;某一条记录增加了一个属性,其他所有记录都要有这条属性;并且当使用ORM(对象关系映射)将关系数据库中的对象实体映射成程序中的实体时,修改表的结构往往意味着要中断服务(重启网站程序)。
键(类的实例) 字段(属性名) 字段值(属性值)
car:2 color 白色
1.赋值和取值 redis>HSET car price 500
HGET car price
HMSET car price 500 color white
HMGET
HSET的方便之处:不区分插入和更新操作
修改数据时不用事先判断字段是否存在来决定是否要执行的是插入操作(update)还是更新操作(insert):
1) 当执行的是插入操作时(即之前字段不存在)HSET命令会返回1
2) 当执行的是更新操作时(即之前字段已存在)HSET命令会返回0
3) 当键本身不存在时,HSET命令还会自动创建它
如果想获取键中所有字段和字段值却不知道键中有哪些字段时,应该使用HGETALL命令
2. 判断字段是否存在,存在返回1,否则返回0
HEXISTS key filed
3. 当字段不存在时赋值
HSETNX key filed value; 与SET命令类似,区别在于如果字段已经存在,HSETNX不执行任何操作
4.增加数字
HINCRBY key field incrementvalue
5. 删除字段:可以删除一个或多个字段,返回值是被删除的字段个数
HDEL key filed
6. 只获取字段名或字段值
HKEYS key
HVALS key
7. 获取字段的数量
HLEN key
3.3 列表类型【有序】
1. 列表类型可以存储一个有序的字符串列表;
2. 列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1)
3. 具体应用:1)获取社交网站的新鲜事2)记录日志
4. 命令
1. 向列表两端增加元素 LPUSH key value/RPUSH key value 可以同时增加多个value【注意增加后的顺序】
返回值表示增加元素后列表的长度
2. 从列表两端弹出元素
LPOP key/RPOP key
返回值为删除(弹出)的元素个数
模拟栈:LPUSH和LPOP 或者 RPUSH和RPOP
模拟堆:LPUSH和RPOP 或者 RPUSH和LPOP
3. 获取列表中元素个数
LLEN key:LLEN时间复杂度为O(1),使用时Redis会直接读取现成的值,而不需要像部分关系数据库那样需要遍历来统计 条目
4. 获得列表片段
LRANGE key start stop (包含两端元素)
1)只获取不删除 2)支持负数索引 -1 表示最右边第一个元素
3)start > stop 则会返回空列表 4) stop大于实际索引范围,则会返回到列表最右边的元素
5.删除列表中指定的值
LREM key count value:删除列表中前count个值为value的元素,返回值是实际删除的元素个数
1) count > 0 从列表左边开始删除前count个值为value的元素
2) count < 0 从列表右边开始删除前|count|个值为value的元素
3) count = 0 删除所有值为value的元素
6. 获得/设置指定索引的元素值-------将列表类型当做数组来用
LINDEX key index
LSET key index value
7. 只保留列表指定片段
LTRIM key start stop
LTRIM和LPUSH命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的100条日志,则每次加入 新元素时调用一次LTRIM命令即可;
8. 向列表中插入元素
LINSERT key BEFORE/AFTER pivot value
9. 将元素从一个列表转到另一个列表
RPOPLPUSH source destination
先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表型键的左边
【重要】 当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移到队尾,借助这个特性我们可以实现 一个网站监控系统;
3.5 集合类型【无序】
1. 集合实现:在redis内部是使用值为空的散列表(hash table)实现的,所以加入或者删除、判断某个元素是否存在等的复杂度为O(1)
2. 命令
2.1 增加/删除元素
SADD key menber [member...]
SREM key member [member...]
(1) SADD命令用来向集合中增加一个或多个元素,如果建不存在则会自动创建。
(2) 如果加入的元素已经存在于集合中就会忽略这个元素。
(3) 返回成功加入/删除的元素数量
2.2 获得集合中的所有元素
SMEMBERS key
2.3 判断元素是否在集合中
SISMEMBER key member
2.4 集合间运算
SDIFF key[key...] 差集运算
SINTER key [key...] 交集运算
SUNION key [key...] 并集运算
2.5 获得集合中元素个数
SCARD key
2.6 进行集合运算并将结果存储=>主要用于进行多步几个运算的场景中
SDIFFSTORE destination key [key...]
SINTERSTORE destination key [key...]
SUNIONSTORE destination key [key...]
2.7 随机获得集合中的元素
SRANDMENBER key [count]
(1) count为正数时,随机从集合里获得count个不重复的元素。count大于集合中元素个数,则SRANDMEMBER会返回集合中的所有元素
(2) count为负数时,SRANDMEMBER会随机从集合里获得|count|个元素,这些元素有可能相同
Redis采用拉链法来解决散列冲突
2.8 从集合中弹出一个元素
SPOP key:从集合中随机选择一个元素弹出
3.6 有序集合类型
1. ZADD key score member [score menber...] 像有序集合中加入一个元素
2. ZSCORE key member 获得元素的分数
3. ZRANGE key start stop[WITHSCORES] 获得排名在某个范围的元素列表
如果两个元素的分数相同,Redis会按照字典顺序("0"<"9"<"A"<"Z"<"a"<"z")来进行排序;如果元素 的值是中文,这取决于中文的编码方式;
ZRANGE命令的时间复杂度为O(logn+m)其中n为有序集合的基数,m为返回的元素个数
4. ZRANGEBYSCORE key min max (WITHSCORE) (LIMIT offset count) 获得指定分数范围的元素
如果希望分数范围不包含端点值,可以在分数前加上“(”
eg ZRANGEBYSCORE scoreaboard 60 +inf LIMIT 1 3 获得分数高于60分的从第二个人开始的3个人
想获取分数低于或等于100分的前3个人:
ZREVRANGESCORE scoreaboard 100 LIMIT 0 3
5. ZINCRBY key increment member 增加某个元素的分数
6. 获得集合中元素的数量 ZCARD key
7. 获得指定分数范围内的元素个数 ZCOUNT key min max
8. 删除一个或多个元素 ZREM key member[member...]
9. 按照排名范围删除元素
ZREMRANGEBYRANK key start stop
10.按照分数范围删除元素
ZREMRANGEBYSCORE key min max
11.获得元素的排名
ZRANK key member 从小到大
ZREVRANK key member 从大到小
12. 计算有序集合的交集
ZINTERSCORE destination numkeys key[key...] [WEIGTHS wight[weight...]][AGGREGATE SUM |MIN|MAX] 参与计算的结合中

浙公网安备 33010602011771号