Redis第4️⃣课 String
2019-04-26 本文已影响1人
小超_8b2f
一、字符串键值结构
key | type | value |
---|---|---|
hello | string | world |
counter | int | 1 |
bits | 二进制 | 010101 |
cat | json | {"name":"hello kitty","age":3,"color":"white"} |
- 注意:不能大于512M。太大会消耗网络流量,开销大
场景:
- 缓存
- 计数器
- 分布式锁
- 等等
命令:
get、set、del
类型:integer
时间复杂度 :o(1)
命令 | 解释 | 异常返回 |
---|---|---|
set key value | 设置 key-value(无论key是否存在) | |
setnx key value | key不存在才设置value 【insert】 | |
set key value xx | key存在才设置value【update】 | |
get key | 获取key 对应的value | (nil) |
del key | 删除key-value | (integer) 0 |
incr key | key自增1 如果key不存在,自增后get(key)=1 |
(error) not int ... |
decr key | key自减1 如果key不存在,自减后get(key)=-1 |
同上 |
incrby key k | key自增key 如果key不存在,自增后get(key)=k |
同上 |
decrby key k | key自减key 如果key不存在,自增后get(key)=-k |
同上 |
127.0.0.1:6379> del key1 key2
(integer) 2
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379> setnx key1 value1
(integer) 1
127.0.0.1:6379> setxx key1 value2
(error) ERR unknown command 'setxx'
127.0.0.1:6379> set key1 value2 xx
OK
127.0.0.1:6379> get key1
"value2"
127.0.0.1:6379> set key2 value1 xx
(nil)
127.0.0.1:6379> set counter 100
OK
127.0.0.1:6379> incr counter
(integer) 101
127.0.0.1:6379> incr counter
(integer) 102
127.0.0.1:6379> incr counter
(integer) 103
127.0.0.1:6379> incrby counter 10
(integer) 113
127.0.0.1:6379> decr counter
(integer) 112
127.0.0.1:6379> decr counter
(integer) 111
127.0.0.1:6379> decr counter
(integer) 110
127.0.0.1:6379> decrby counter 10
(integer) 100
127.0.0.1:6379> get counter
"100"
命令 | 解释 | 异常返回 |
---|---|---|
setnx key value | key不存在才设置value 【insert】 | |
set key value xx | key存在才设置value【update】 | (nil) |
mset key1 value1 key2 value2... | 批量设置key,value | o(n) |
mget key1 key2 key3 ... | 批量获取多个key的值 get太多个值也得做拆分 eg:把10w拆成10个1w的mget |
o(n) |
127.0.0.1:6379> del key1 key2
(integer) 2
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379> setnx key1 value1
(integer) 1
127.0.0.1:6379> setnx key1 value2
(integer) 0
127.0.0.1:6379> setxx key1 value3
(error) ERR unknown command 'setxx'
127.0.0.1:6379> set key1 value3 xx
OK
127.0.0.1:6379> get key1
"value3"
127.0.0.1:6379> set key2 value1 xx
(nil)
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3_3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value1"
2) "value2"
3) "value3_3"
127.0.0.1:6379> mget key1 key2 key100
1) "value1"
2) "value2"
3) (nil)
命令 | 解释 | 异常返回 |
---|---|---|
getset key newValue | set key newValue 并返回oldValue | |
append key value | 将value 追加到旧的value后 | |
strlen | 返回字符串的长度(注意中文) |
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> getset hello php
"world"
127.0.0.1:6379> append hello ,java
(integer) 8
127.0.0.1:6379> get hello
"php,java"
127.0.0.1:6379> strlen hello
(integer) 8
127.0.0.1:6379> set hello "足球"
OK
127.0.0.1:6379> strlen hello
(integer) 6
127.0.0.1:6379> get hello
"\xe8\xb6\xb3\xe7\x90\x83"
命令 | 解释 | 异常返回 |
---|---|---|
incrbyfloat key 3.5 | 增加key对应的值3.5 ,可以写负数 | |
getrange key start end | 获取字符串指定下标的子串 | |
setrange key index value | 设置指定下标的值 |
127.0.0.1:6379> set key 3.5
OK
127.0.0.1:6379> get key
"3.5"
127.0.0.1:6379> incrbyfloat key 3.5
"7"
127.0.0.1:6379> set key1 sss
OK
127.0.0.1:6379> incrbyfloat key1 3.5
(error) ERR value is not a valid float
127.0.0.1:6379> set key1 5
OK
127.0.0.1:6379> incrbyfloat key1 3.5
"8.5"
127.0.0.1:6379> incrbyfloat key1 -3.5
"5"
127.0.0.1:6379> set hello javabest
OK
127.0.0.1:6379> getrange hello 0 3
"java"
127.0.0.1:6379> setrange 0 H
(error) ERR wrong number of arguments for 'setrange' command
127.0.0.1:6379> setrange hello 0 H
(integer) 8
127.0.0.1:6379> get hello
"Havabest"
实战:实现如下功能
- 记录网站每个用户个人主页的访问量
incr userid:pageView (单线程,无竞争)
- 缓存视频的基本信息(数据源在MySQL中)伪代码
public VedioInfo get(long id) {
String redisKey = redisPrefix + id;
VedioInfo info = redis.get(redisKey);
if(info == null) {
info = mysql.getById(id);
if(info != null)
redis.set(redisKey,serialize(info));//序列化
}
}
![](https://img.haomeiwen.com/i13617909/3bbaca47ccc41b53.png)
3.分布式id生成器
![](https://img.haomeiwen.com/i13617909/7add0ab69b0c6674.png)
![](https://img.haomeiwen.com/i13617909/3bd1c62e0732fe1c.png)
![](https://img.haomeiwen.com/i13617909/83e2141a2758458e.png)
incr idKey (原子操作)