Redis系列学习笔记2 Redis字符串

字符串

设置值

SET key value [NX|XX]
[NX|XX]为可选。
NX:仅在键key不存在的情况下,才进行设置操作,如果键存在,那么将不做任何动作。
XX:仅在键key已经存在的情况下,才进行设置操作,如果键key不存在,那么不做任何动作

SET key value NX和SETNX key value效果一样
SET key value XX和SETXX key value效果一样

获取字符串的值

GET key

多个键值对

设置多个键值对

MSET key value [key value …]

获取多个键值对

MGET key [key …]

设置新值并返回旧值

GETSET key new-value

redis中存在 key value键值对,执行
GETSET key new-value
会将key的值设置为new-value,同时返回值为value

追加内容到字符串末尾

APPEND key value

示例:
SET key value
APPEND key -1
最后的值为value-1

返回值的长度
STRLEN key

字符串索引

  • 正数索引

    以hello字符串为例
    索引值:0 1 2 3 4
    字符串:h e l l o
    
  • 负数索引

    以hello字符串为例
    索引值:-5 -4 -3 -2 -1
    字符串: h  e  l  l  o
    

SETRANGE key index value

从索引index开始,用value覆写给定键key所储存的字符串值

例:

redis>SET msg "hello"
redis>SETRANGE msg 1 "appy"
redis>GET msg
"happy"

GETRANGE key start end

返回键 key 储存的字符串值中,位于 start 和 end 两个索引之间的内容(闭区间,start 和 end 会被包括在内)。和SETRANGE 只接受正数索引不同,GETRANGE的索引可以是正数或者负数。

数字操作

只要储存在字符串键里面的值可以被解释为 64 位整数,或者 IEEE-754 标准的 64 位浮点数,那么用户就可以对这个字符串键执行针对数字值的命令。

INCRBY key increment

将key的值增加increment

DECRBY key decrement

将key的值减少decrement

注意:键不存在时,键的值初始化为0,然后再执行加减操作

INCR key

将key的值加1

DECR key

将key的值减1

API

IdGenerator(name,client): 设置id生成器的名字和客户端
IdGenerator.gen(): 生成一个新的自增id
IdGenerator.init(n):保留前n个id,IdGenerator.init(10000),这样生成器创建的id就会从10001开始

INCRBYFLOAT key increment

increment为浮点数

当用户针对一个数字值执行APPEND、STRLEN、SETRANGE和GETRANGE命令时,Redis会先将数字值转换为字符串,然后再执行命令。

SETBIT key index value
将给定索引上的二进制位的值设置为value,命令返回被设置的位原来存储的旧值

例如将10110000设置第2位为1
SETBIT bits 2 1
10110000
变成
10110100

GETBIT key index

返回给定索引上的二进制位的值

BITCOUNT key [start][end]

计算并返回字符串键存储的值中,被设置为1的二进制位的数量

BITOP operation destkey key[key …]
对一个或者多个保存二进制位的字符串键执行位元操作,并将结果保存在destkey上。operation可以是AND、OR、NOT、XOR这四种操作中的任意一种:

逻辑操作

逻辑操作 描述
BITOP AND destkey key [key1 …] 对一个或者多个key求逻辑并,并将结果保存到destkey
BITOP OR destkey key [key1 …] 对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
BITOP XOR destkey key [key1 …] 对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
BITOP NOT destkey key 对给定 key 求逻辑非,并将结果保存到 destkey 。

在线用户统计应用示例

API 说明 命令操作
OnlineCount(when, client) 记录给定时间内的在线用户数量。
OnlineCount.inclue(user_id) 将给定用户记录为在线。 调用SETBIT命令
OnlineCount.result() 返回给定时间内的在线用户数量。 调用BITCOUNT命令

目前这个实现的优点:

  • 将用户设置为在线的速度非常快, O(1) 。
  • 即使用户数量非常大,占用的内存也不多:记录一百万用户仅需一百万位,也即是 0.125 MB;记录一千万用
    户仅需一千万位,也即是 1.25 MB 。
  • 可以在现有程序的基础上,做进一步的操作。举个例子,我们可以使用 BITOP AND 命令,将多个在线记录作
    为输入,计算出全勤用户的数量(全勤指的是,用户在所有输入的在线统计记录中,都显示为在线)。

目前这个实现的缺点:

  • 每次进行统计的复杂度为 O(N) 。
  • 没办法轻易地获取所有在线用户的名单,只能遍历整个二进制值,复杂度为 O(N) ,其中 N 为二进制位数
    量。

进一步的优化:

  • 用户量不大并且需要获取在线用户名单的话,可以使用之后介绍的集合数据结构来实现。
  • 不需要获取在线用户名单,并且不需要精确的在线统计数量,可以使用之后介绍的 HyperLogLog 来实现。

存储中文时的注意事项

STRLEN、SETRANGE 和 GETRANGE 不适用于中文

你可能感兴趣的:(Redis)