Redis 的字符串是一个有字节组成的序列,可以存储以下 3 种类型的值:字节串(byte string)、整数、浮点数。
在需要的时候, Redis 会将整数转换成浮点数。整数的取值范围和系统的长整型(long)的相同,浮点数取值范围和精度与 IEEE 754 标准下的双精度浮点数(double)的相同。
Redis 中的自增命令和自减命令 P39 命令 格式 描述INCR INCR key 将键存储的数字值加上 1
DECR DECR key 将键存储的数字值减去 1
INCRBY INCRBY key increment 将键存储的数字值加上整数增量 increment
DECRBY DECRBY key decrement 将键存储的数字值减去整数减量 decrement
INCRBYFLOAT INCRBYFLOAT key increment 将键存储的数字值加上浮点数增量 increment
相关演示代码如下(main 及 handleResult 定义见:01. Redis 数据结构简介.md):
// 执行字符串类型数字相关操作 func executeNumberOperation(conn redis.Conn) { // 删除原有值 handleResult(redis.Int(conn.Do("DEL", "number"))) // 获取值,输出 -> ERROR: redigo: nil returned handleResult(redis.Int(conn.Do("GET", "number"))) // 自增 1,返回自增后的值 -> 1 handleResult(redis.Int(conn.Do("INCR", "number"))) // 自增 2,返回自增后的值 -> 3 handleResult(redis.Int(conn.Do("INCRBY", "number", "2"))) // 自减 1,返回自减后的值 -> 2 handleResult(redis.Int(conn.Do("DECR", "number"))) // 自减 2,返回自减后的值 -> 0 handleResult(redis.Int(conn.Do("DECRBY", "number", "2"))) // 自增 1.5,返回自增后的值 -> 1.5 handleResult(redis.Float64(conn.Do("INCRBYFLOAT", "number", "1.5"))) // 自增 -1.3,返回自增后的值 -> 0.2 handleResult(redis.Float64(conn.Do("INCRBYFLOAT", "number", "-1.3"))) } 供 Redis 处理子串和二进制位的命令 P40 命令 格式 描述APPEND APPEND key value 将 value 追加到 key 当前值的末尾
GETRANGE GETRANGE key start end 返回 [start, end] 范围内子串
SETRANGE SETRANGE key offset value 将子串 [offset, offset + len(value)) 设置为 value
GETBIT GETBIT key offset 将字符串看作是二进制位串,获取 offset 上的位
SETBIT SETBIT key offset value 将字符串看作是二进制位串,设置 offset 上的位为 value
BITCOUNT BITCOUNT key [start end] 统计 [start, end] 范围内子串在二进制下有多少个 1
BITOP BITOP operation destkey key [key ...] operation 可选位运算 AND , OR , XOR , NOT ,将一个或多个二进制位串执行的操作结果存到 destkey 中
相关演示代码如下:
// 执行字符串类型字符串相关操作 func executeStringOperation(conn redis.Conn) { // 删除原有值 handleResult(redis.Int(conn.Do("DEL", "string"))) // 追加串,返回当前字符串长度 -> 6,值变为 -> append handleResult(redis.Int(conn.Do("APPEND", "string", "append"))) // 获取子串,返回 -> en handleResult(redis.String(conn.Do("GETRANGE", "string", 3, 4))) // 设置子串,返回当前字符串长度 -> 6,值变为 -> appled handleResult(redis.Int(conn.Do("SETRANGE", "string", 3, "le"))) // 设置子串,返回当前字符串长度 -> 11,值变为 -> application handleResult(redis.Int(conn.Do("SETRANGE", "string", 3, "lication"))) // 获取二进制位,返回 -> 1 // (获取第 7/8 个字符 a 在二进制下第 7%8 位上的二进制位,即 0110 0001 的第 7 位 1) handleResult(redis.Int(conn.Do("GETBIT", "string", 7))) // 设置二进制位,返回原来的二进制位 -> 0,值变为 -> cpplication // (设置第 6/8 个字符 a 在二进制下第 6%8 位上的二进制位为1,即 0110 0001 变为 0110 0011) handleResult(redis.Int(conn.Do("SETBIT", "string", 6, 1))) // 统计二进制位,返回 -> 7 // (统计 [0, 1] 范围内子串 cp 在二进制下 0110 0011 0111 0000 二进制位为 1 的数量) handleResult(redis.Int(conn.Do("BITCOUNT", "string", 0, 1))) handleResult(redis.String(conn.Do("SET", "aKey", "aa"))) handleResult(redis.String(conn.Do("SET", "bKey", "b"))) // 对 aa(0110 0001 0110 0001) 和 b(0110 0010 0000 0000) 进行 按位或,结果存储到 cKey 中 // 返回字符串长度 -> 2,值为 ca(0110 0011 0110 0001), handleResult(redis.Int(conn.Do("BITOP", "OR", "cKey", "aKey", "bKey"))) }