String(字符串)
String类型使用场景:value除了是我们的字符串还可以是我们的数字,redis会自动帮我们辨别转化
- 计数器
- 统计多单位的数量
- 粉丝数,关注数,浏览量
- 对象缓存存储
String类型常用方法
1 append append (key 给哪个键 string 追加什么内容)追加字符串,追加成功后返回当期这个key的长度, 如果当前追加的这个key不存在就新创建一个key
127.0.0.1:6379[2]> get name #查看wyh "wyh" 127.0.0.1:6379[2]> append name yyt #给wyh这个键拼接字符串 (integer) 6 #返回当前这个key追加内容后的长度 127.0.0.1:6379[2]> append name1 zhangsan #如果当前追加的这个key不存在就新创建一个key (integer) 8 #返回当前这个key追加内容后的长度
2 strlen strlen (key) 查看某个key的长度
127.0.0.1:6379[2]> strlen name #查看某个key的长度 (integer) 6 #返回这个key的长度 127.0.0.1:6379[2]> strlen name2 #查看某个不存在key的长度 (integer) 0 #不存在的话返回0 127.0.0.1:6379[2]> set views 0 OK
3 incr incr(key)自增 默认自增1
场景:浏览量,当前观看人数,都是它实现的,相当于java的i++
127.0.0.1:6379[2]> set views 0 #设置一个播放量 OK 127.0.0.1:6379[2]> incr views #让views这个key自增(i++) (integer) 1 127.0.0.1:6379[2]> incr views #让views这个key自增(i++) (integer) 2 127.0.0.1:6379[2]> incr views #让views这个key自增(i++) (integer) 3 127.0.0.1:6379[2]> incr views #让views这个key自增(i++) (integer) 4 127.0.0.1:6379[2]> get views #查看这个key "4"
4 decr decr(key)自减,默认每次减少1,可以为负数
127.0.0.1:6379[2]> decr views #让views这个key自减1 (integer) 3 127.0.0.1:6379[2]> decr views #让views这个key自减1 (integer) 2 127.0.0.1:6379[2]> decr views #让views这个key自减1 (integer) 1 127.0.0.1:6379[2]> decr views #让views这个key自减1 (integer) 0 127.0.0.1:6379[2]> decr views #让views这个key自减1 (integer) -1 #可以为负数 127.0.0.1:6379[2]> get views #查看views这个Key "-1"
5 incrby incrby (key) (numb)让某个键一次性步长几个长度
127.0.0.1:6379[2]> incrby views 10 #一次性步长10 (integer) 9
6 decrby decrby (key) (numb)让某个键一次性步减几个长度
127.0.0.1:6379[2]> decrby views 10 #一次性步减10 (integer) -1
7 range range (key) (index从哪里开始,长度也是从0开始的) (截取几位)查看区间指定的值,类似substring截取,如果截取的这个参数为-1显示全部的字符串,其实和get key是一样的作业
127.0.0.1:6379[2]> set key1 hello,weiyihe #创建一个key OK 127.0.0.1:6379[2]> getrange key1 0 3 #查看区间指定的值(从0开始,数3位,也就是前四位) "hell" 127.0.0.1:6379[2]> getrange key1 0 -1 ##如果截取的这个参数为-1显示全部的字符串 和get key是一样的 "hello,weiyihe"
8 setrange setrange(key)(index)(value)把key按照指定的下表替换成指定的值
其实就是java中的replace替换
127.0.0.1:6379[2]> set key3 abc #设置一个新的key OK 127.0.0.1:6379[2]> setrange key3 0 x #把key3按照指定的下表和值进行替换(把第0位换成x) (integer) 3 #替换之后得到最终结果的长度 127.0.0.1:6379[2]> get key3 # "xbc" # 查看key3 127.0.0.1:6379[2]> setrange key3 0 xxx # #把key3按照指定的下表和值进行替换(把第0位换成xxx) (integer) 3 # 替换之后得到最终结果的长度 127.0.0.1:6379[2]> get key3 #查看key3 "xxx"
9 setex settex(set with expire) 设置过期时间 setex(key) (time,存活时间,一般都是秒s)(key的value)
127.0.0.1:6379[2]> setex key3 30 "hello" #设置一个值为hello的键Key3,有效期30秒 OK 127.0.0.1:6379[2]> get key3 #查看key3 "hello" 127.0.0.1:6379[2]> ttl key3 #查看当期key3的有效时间 (integer) 19 #19s(秒) 127.0.0.1:6379[2]> ttl key3 #查看当期key3的有效时间 (integer) 18 #18s(秒) 127.0.0.1:6379[2]> get key3 #查看key3 (nil) #没了(过期了) 127.0.0.1:6379[2]> ttl key3 #查看key3 (integer) -2 #没了(过期了)
11 setnx settex(set if not exist) 不存在设置 (在分布式锁中经常使用) setnx (key) (key 的value)成功的话返回1(一般成功就创建一个新的key,或者把key的value改变),不成功返回0,不成功因为设置那个key已经存在了
127.0.0.1:6379[2]> setnx mykey redis #设置一个叫mykey的键 (integer) 1 #成功返回1 127.0.0.1:6379[2]> get key3 (nil) 127.0.0.1:6379[2]> setnx mykey mysql #重新设置mykey的键,不成功,因为已经有了一个叫mykey的key (integer) 0 #不成功返回0 127.0.0.1:6379[2]> get mykey #查看key mykey "redis" 127.0.0.1:6379[2]> setnx mykey1 mysql #设置一个叫mykey1的键 (integer) 1 #成功,因为没有叫mykey1的key 127.0.0.1:6379[2]> get mykey1 #查看key mykey1 "mysql"
12 mset mset (k1 v1)( k2 v2) (k3 v3)一次性设置多个键值对
127.0.0.1:6379[2]> mset k1 v1 k2 v2 k3 v3 #一次性设置三个键值对(k1 v1)( k2 v2) (k3 v3) OK 127.0.0.1:6379[2]> keys * #查看全部的值 1) "k3" 2) "k2" 3) "k1"
13 mget mget (k1 k2 k3)一次性获取多个key的值
127.0.0.1:6379[2]> mget k1 k2 k3 #一次性获取多个key的值 1) "v1" 2) "v2" 3) "v3"
14 msetnx msetnx(key value)
msetnx是一个原子性操作(要么全部成功,要么全部失败)
127.0.0.1:6379[2]> mset k1 v1 k2 v2 k3 v3 #一次性获取多个key的值 OK 127.0.0.1:6379[2]> keys #查看全部的key 1) "k3" 2) "k2" 3) "k1" 127.0.0.1:6379[2]> mget k1 k2 k3 #一次查看三个key 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379[2]> msetnx k1 v1 k4 v4 #注意,这时候k1 v1已经存在,但是k4 v4不存在,返回结果为0失败,说明该操作具有原子性(要么全部成功,要不全部失败) (integer) 0 #操作失败 127.0.0.1:6379[2]> get k4 #查看key4 (nil) #没有key4
15 msetnx 扩展
开发场景:一般创建对象 set user:1{name:"张三",age:10}设置一个user:1对象.它的值为一个json字符串来保存一个对象
这里的key是一个巧妙的设计 user:{id}:{filed}如此设计在redis中是完全可以的
127.0.0.1:6379[2]> mset user:1:name zhangsan user:1:age 10 #设置一个user1对象,它的name是zhangsan,age是10 OK 127.0.0.1:6379[2]> mset user:2:name lisi user:2:age 20 #设置一个user2对象,它的name是lisi,age是20 OK 127.0.0.1:6379[2]> mget user:1:name user:1:age #获取user1对象的name和age 1) "zhangsan" 2) "10" 127.0.0.1:6379[2]> mget user:2:name user:2:age #获取user2对象的name和age 1) "lisi" 2) "20"
127.0.0.1:6379[2]> mset user1:name zhangsan user1:age 10 #创建一个user1多key,json字符串的值 OK 127.0.0.1:6379[2]> get user1:name #单个获取user1的name "zhangsan" 127.0.0.1:6379[2]> get user1:age #单个获取user1的age "10" 127.0.0.1:6379[2]> mget user1:age user1:name #一次性获取m1的name和age 1) "10" 2) "zhangsan"