redis基本数据类型字符串(string)学习笔记
0 环境
- 系统环境: centos7
- 编辑器: xshell
1 前言
在redis中 key--> 字符串 不同的key对应的值不同 则具备不同的数据结构 5种数据结构(主指值的数据类型不同)
2 string(字符串)
字符串键是redis最基本的键值对类型(key-value形式 键值可以文字 图片。。) redis中的字符串是动态字符串 内部可修改(stringbuffer) 减少内存的频繁分配 当实际分配内存>现有的内存(字符串<1M 在现有空间上扩容 每次扩1M 最大512M)
- set(为字符串键设置值)
set给一个key赋值 实际情况 新加入的键可能会出现在数据库的任何位置上(无序)
复杂度: O(1)
覆盖规则 相同的key赋值 后来的覆盖前来的
不过现在提供nx选项 只有key对应的value没有值的执行设置
// 伪代码 只为容易理解 别钻牛角尖
if(set.get(key)== null){
set.get(key) = value;
}
setnx --> 输出的结果 成功1 失败0
set key value [nx|xx] nx --> 成功 ok 失败 nil xx正好与之相反
- get(获取字符串键的值)
时间复杂度:O(1)
- getset(获取旧值并设置新值)
复杂度:o(1)
getset类似:
string.get(key);
string.set(key, value);
- mset(一次为多个字符串键设置值)
时间复杂度o(n) 命令
mset key value [key value...]
- mget(一次性获取多个字符串键的值)
时间复杂度o(n) 命令
mget key[key ...]
- msetnx(只在键不存在的时候 一次为多个字符串键设置值)
时间复杂度o(n) 命令
msetnx key value [key value...]
// 只是为了方便理解
list a = new arraylist();
string.foreach(key:keys){
if(string.get(key)!= null){
return;
}
a.add(string.get(key));
}
- STRLEN(获取字符串值的字节长度)
复杂度:o(1)
- 字符串索引
正数索引从0(头)开始
负数索引从最末尾-1开始 从后往前递减 从前往后递增计算方式(-xxx.size。。。-1)
- GETRANGE(获取字符串值索引范围的内容)
时间复杂度o(n)
命令
GETRANGE key start end
类似数组的切片list[start:end] 类似看书 我们想获取想看的某某章节(查询) 只是展示 不影响数据本身
- SETRANGE(对字符串值的指定索引范围进行设置)
命令SETRANGE key index substitue
可类似substring方法 之前的set粗暴的很 一刀切 现在该命令更加精细 一线喉
假设场景 在浴室搓背 对于有的人 角质不多 一刀切 set挺好 对于有的人 角质存在的不均匀 那么就得重点照顾了 SETRANGE就挺好 舒服(首先你得一刀切 才能知道是否需要一线喉 现有set 后有SETRANGE)
自动扩展被修改的字符串
if old.size < new.size malloc xxx
- APPEND(在值末尾追加新内容)
命令APPEND key suffix
类似火车车厢最后追加车厢 若是前面车厢为空(处理不存在的键) 此刻类似set操作
- INCR、DECR(对整数值+1 -1操作)
- INCRBY、DECRBY(对整数值+n -n操作)
INCRBY key increment
DECRBY key increment
类型限制 值限制 步长类型限制
对于不存在的值操作
- INCRBYFLOAT(对数字值进行浮点数+ -操作)
INCRBYFLOAT key increment
执行操作时 命令最多只会保留计算结果小数点后的17位数字
- 查看key的有效期
- 给key设置值时 顺便设置过期时间(s)
- 给key设置值时 顺便设置过期时间(ms)
3 string BIT命令
在redis中 字符串以二进制的形式来存储。BIT相关命令对二进制就行操作(位操作 offset --> 可看做为步长)
-
getbit
key对应的value 在offset处的bit值 -
setbit
修改key对应的value在offset处的bit值 -
bitcount
统计二进制数据中1的个数 -
例子 a(97)对应的二进制01100001