redis数据结构操作--字符串类型操作
---redis 数据结构操作
---字符串类型操作
set 设置的就是字符串类型的 变量
set key value [ex 秒数] / [px 毫秒数] [nx][xx]
--举例
set a 1 ex 10 ---10秒有效期
set a 1 px 9000 ---有效期 9000毫秒 =9秒
--ex px 不能同时写;否则 以 后面有效期为准
例如:
set a 1 ex 100 px 9000 实际上有效期 9000毫秒
nx :表示 key 不存在的时候执行操作--相当于新建
xx :表示 key 存在的时候,执行操作---相当于修改
flushdb ---冲刷db 则这个db 的所有key 全部没了;
keys * ---返回空
set site www.zixue.it ---默认永久有效
ttl site ---返回结果 -1
set search www.baidu.com ex 10 px 1567 ---因为 ex px 同事使用;所以 以 px 为准,生命周期 1567 毫秒
get search ---发现返回 空
ttl search ---返回 -1 ---说明 1567 毫秒 时间太短;get 的时候直接 过期了
----换一个大一点的值
set search www.baidu.com ex 10 px 6567
get search --返回结果 www.baidu.com
pttl search ---返回还剩下 2528毫秒
---
flushdb ---冲刷db
set site www.zixue.it
set site www.baidu.com nx ---表示 site 不存在的时候,在做修改操作,存在则修改失败---由于已存在,返回失败 nil
get site
www.zixue.it
set site www.google.com xx ----表示必须存在site 才能做修改,由于site 存在,返回结果 OK
get site
www.google.com
---
set abc www.google.com xx ----因为abc 本身不存在,所以返回 nil
---一次设置多个值 mset
mset a aman b bold c controller d diamond
keys * ---显示
a
d
b
c
site
---分别查看 z b c d 值
get a
get b
...
---mget 一次 查询(获取)多个 键值
mget a b c d
--setrange key offset value
--把 offset 偏移字节改成 value
例如: site 值
hell this is
偏移量从 0 开始 假如,指针指向 t 和 h 中间;则 offset 变更 h 后面的值
setrange site 5 xyz
get site --返回结果 hell txyz is ---把 his 换成了 xyz
flushdb
set world hell
get world --返回hell
setrange world 2 ??
get world ---返回结果 wor??
---假如 offset 偏移量大于 world 全部字符的个数,会发生什么情况呢?
假如 5个人字符,一下子便宜到 10个字符,那中间的几个字符怎么办?使用 \x00填充
即:如果偏移量>字符长度 ,该字符 自动补 0x00
--测试
set world hello
setrange world 6 !
get world --返回结果 hello\x00!
--append key value --把 value 追加到key 原值上
append world @@
get world --返回:hello\x00!@@
---获取key 一小部分值 获取字符串中 [start stop] 范围值
getrange key start stop
--注意:对于字符串的下标,从左数 0开始 ,右数 -1 开始
set area chiness
getrange area 1 4 ---返回结果 hine
--假如不知道单词有多长,我就想获取倒数 第几个,怎么办呢?
set status working --想去掉 ing
getrange status 0 -4 --返回结果 work
---假如 start 比 stop 值还大,怎么办呢?
getrange status 6 3 ---返回 空 ""
---假如 stop 比 实际字符串 大很多
即:
1.start > length 则返回空字符串
2.stop > length 则 截取 到字符尾
3.如果 start 所处位置在 stop 右边,返回空字符串
---getset 获取就值的同时设置新值
set status sleep
getset status wakeup ---返回值 sleep
get status --返回 wakeup
getset status working ---返回 wakeup
---inc dec
set age 29
get age --返回29
--长一岁
incr age ----返回结果 30
--降一岁
decr age ---返回 29
---秒杀,抢票这类的工作
--10W 手机,约等于 10W 订单,先拿到资格
set num 100000
derc num ---返回99999
----不想 一岁一岁涨 ,假如想一下子涨5岁
incrby age 5 ---返回结果 34
incrby age 5 ---返回结果 39
decrby age 10 ---一下子降10岁
incrbyfloat --浮点数增加
incrbyfloat age 0.5 ---返回结果29.5 岁
decybyfloat age 1.5 ---返回 28岁
---在位上做操作??
给定字母 可能是 A--Z
但是具体是谁不知道,如何把他们变成 小写字母
set char A
get char ---返回A
set char a
get char ---返回小写a
---ascli 码表 中
A 的值 65 转换成 二进制 64+1 即: 0100 0001 如果从 位的角度看,一个字节 8个位
a 的值 97 转换成 二进制 98+1 即: 0110 0001
--同理
B 66 B 和 b 差了 32个
b 98
--大小写之间来回转换,通过 位 操作 达到效果
setbit key offset value
设置 offset 对应二进制位上的值
返回:改位上的旧值
注意:
1.如果 offset 过大,则会在中间填充 0
2.offset 最大大到多少?
---举例:
set char A
等于把 :0100 0001 偏移量是 2 的位 上的0 改成 1 0110 0001
setbit char 2 1 ---返回 0
get char ---返回结果 小a
---同理,小写变成 大写
setbit char 2 0 ---返回1
get char ---返回结果 A
---offset 这个值最大能大到多少???
假设可以大到N
调 max offset N
意味着 valus 一共有 n+1 个位
意味着 (n+1)/8 个字节
---可以推算出字符串 的值是多大?
---2 的 32次方 4294967296
setbit char 4294967296 1 ---返回报错 (error) ERR bit offset is not an integer or out of range --值超出范围了
---把值改小一点
setbit char 4294967295 1 ---返回 0 表示设置成功
即:最大值能达到 2的 32次方-1 =4294967295
---得出字符串最大长度:
2^32*2^-3 =2^29 =10+10+9 K-M, 512M
总结:redis 设置字符串变量的时候得到的最大值 512M
offset 最大 2^32-1 即可以推出最大的字符串 512M
释放内存
flushdb
---bitop 作用:让两个 key 做相应的位上的:and or not xor
0010 0000
setbit upper 2 1
get upper ---返回 " " 也不知道是啥
setbit lower 2 1 ---返回 0 谁跟这个 值 and or 谁变成 小写
set char Q
---让上面两个做 位上的 碰撞
bitop or char char lower ---返回1
---操作结果放在 char 上(第一个char 是)
get char ---返回小写 q
---可以尝试 1101 1111 ---碰到谁 跟谁 and 一下 ???