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 一下 ???

 

posted @ 2019-07-16 11:20  钱若梨花落  阅读(291)  评论(0编辑  收藏  举报