美文网首页
全局命令与String

全局命令与String

作者: Robin92 | 来源:发表于2019-08-05 23:57 被阅读0次

全局命令

keys *      // 遍历所有键, 线上一定要禁用, 有可能阻塞其他操作, O(n), 成功返回 OK
dbsize      // 键总数, 直接读取 db 中存的一个变量, O(1)
exists key  // 检查键是否存在, 存在返回 1, 不存在返回 0
del key [key ...]    // 删除键, 返回删除成功的键的个数
expire key seconds   // 添加过期时间
ttl key        // 返回键的剩余过期时长. >= 0 为过期时长, -1 表示没有过期时间, -2 表示 键不存在
type key       // 返回数据结构类型, 如 string, list 等, 若 键不存在返回 none
object encoding key // 查询内部编码, 如: string 的内部编码可能是 int 或 embstr。(只有 int 才可以用 incr/incrby 命令)

数据结构和内部实现

数据结构与对应的内部编码 关系如下:

  • string: raw, int, embstr
  • hash: hashtable, ziplist
  • list: linkedlist, ziplist
  • set: hashtable, intset
  • zset: skiplist, ziplist

redis 可以在 节省内存 与 节省性能 之间选择合适的内部编码使用

数据库管理命令

select dbIndex // redis 用数字作 db 名, 默认 16 个库, 0 ~ 15
flushdb/flushall // 清除 db, 前者清除当前库, 后者消除所有库

不建议使用一个 redis 实例切换 db 存储数据的方式, 在 3.0 版本中已弱化了这个功能,分布式的 cluster 上只允许使用 0 号数据库,只不过向下兼容仍然支持。 建议在一台机器上部署多个 redis 实例, 用不同端口做区分,原因如下:

  • Redis 是单线程的, 使用多个数据库仍是在用一个 CPU, 彼此间有影响
  • 调试和运维也有影响, 如一个慢查询依然会影响其他数据库
  • 切换 db 的方式容易引起混乱,且部分 redis 客户端不支持这种方式
  • flushdb/flushall 会删除单个/所有数据库的数据(后面会介绍用 rename-command 规避这一问题)
  • 由于删除也需要时间, 所以 flushdb/flushall 也有可能阻塞 redis.

String 命令

(操作的类型又分 int, string, bitmap)

其他数据结构都是在字符串类型的基础上构建的, 它甚至可以存二进制数据 (如图片, 音频, 视频), 最大值不可超过 512 MB

set key value [ex seconds] [px milliseconds] [nx/xx]
  • ex seconds: 设置秒级过期时间
  • px millisecond: 设置毫秒级过期时间
  • nx: 键必须不存在才可以成功 (创建), 等同于 setnx 命令
  • xx: 键必须存在才可以成功 (更新)
setex key seconds value
setnx key value
get key

获取值, 若 key 不存在, 返回 nil

mset key value [key value ...]

批量设置值

mget key [key ...]

批量获取值, 按照 key 的顺序返回, 若不存在的 key 对应为 nil

TIP: 能用 mget 就不要用 get * n 次, 因为一次 get 在 发送命令, 执行 get, 返回结果上都有花费时间, 而 mget 发送命令一次, 执行 n 次 get, 返回结果一次, 所以所花的网络时间 (发送命令, 返回结果) 少了很多

incr key

自增操作, 若不是整数, 返回错误, 是整数返回自增后结果, 若键不存在, 返回 1
另有类似的 decr (自减), incrby (自增指定的数值), decrby (自减指定数值), incrbyfloat (自增浮点数)

append key value

字符串尾部追加值 (拼接)

strlen key

计算字符串值长度 (中文占 3 个字节)

getset key value

设置并返回原值 (set 命令返回改后的值), 原来无 key 返回 nil(相当于先 get 再 set)

setrange key offset value

设置指定字符位置 (替换) (??? 只是字符操作还是字符串操作)

getrange key start end

获取部分字符串, 偏移量从 0 开始

String 使用场景

  • 缓存: 加速读写
  • 计数
  • 共享 Session: 用 redis 将 sessin 集中管理, 尤其可以解决在分布式服务下将用户的访问均衡到不用的服务器上的场景
  • 限速: 利用设置过期时间的特性, 如在获取验证码限制频率的场景下

相关文章

  • 全局命令与String

    全局命令 数据结构和内部实现 数据结构与对应的内部编码 关系如下: string: raw, int, embst...

  • redis命令

    redis有5种数据类型:string,list,hash,set,zset。 全局命令 每种类型都有自己的专有命...

  • 2018-09-26 vscode使用vim全局替换

    vim,gvim下一直使用如下命令全局替换::%s/pattern/string/g 最后才发现g是指替换整行所有...

  • JavaScript里的原型与原型链

    目录 - 全局对象 - 简单类型与对象 - Number、Boolean、String、Object四个对象 - ...

  • redis使用相关命令

    Redis keys 命令 下表给出了与 Redis 键相关的基本命令: Redis String类型相关命令 R...

  • 03- global 顶层对象

    1、从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩 var 命令和 function 命令声明的全局变量,依...

  • 类型转换

    任意类型转字符串 String(x) 这是一个全局函数,可以在全局调用:window.String() x.toS...

  • 类型转换

    任意类型转字符串 String(x) 这是一个全局函数,可以在全局调用:window.String() x.toS...

  • string 与int相互转化

    string转int atoi int转string c++11标准增加了全局函数std::to_string: ...

  • 全局变量

    客户端全局变量 bool GlobalVariableCheck( string 全局变量名 ) 检查全局变量存...

网友评论

      本文标题:全局命令与String

      本文链接:https://www.haomeiwen.com/subject/canvdctx.html