1.Redis字符串结构
对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset
比如下面的
键值对的value还可以更加复杂,比如可以是json格式,xml格式,序列化等
字符串类型的value的长度不能大于512MB。
在实际生产中,如果一个值保存成500MB的话,获取这个值的时候会占用很多的网络流量,其次读取的时候也会非常慢,这对于Redis这种单线程应用来说并不明智
在生产环境中,考虑到并发和网络流量的因素,value的大小建议在100KB以内
Redis字符串的使用场景:
缓存 计数器,比如视频网站中视频的播放次数统计等 分布式锁
2.Redis字符串相关命令
2.1 get命令,set命令和del命令
get key 获取key对应的valueset key value 设置key-value del key 删除key-value
例子:
127.0.0.1:6379> set hello 'world'OK127.0.0.1:6379> get hello"world"127.0.0.1:6379> del hello (integer) 1127.0.0.1:6379> get hello (nil)
注意事项:
get命令,set命令和del命令的时间复杂度都是O(1)
2.2 整型操作命令
incr key key自增1,如果key不存在,自增后get(key) = 1decr key key自减1,如果key不存在,自减后get(key) = -1incrby key k key自增k,如果key不存在,自增后get(key) = k decrby key k key自减k,如果key不存在,自减后get(key) = -k
例子:
127.0.0.1:6379> get counter(nil) 127.0.0.1:6379> incr counter(integer) 1 127.0.0.1:6379> get counter"1" 127.0.0.1:6379> incrby counter 99 (integer) 100 127.0.0.1:6379> get counter"100" 127.0.0.1:6379> decr counter(integer) 99 127.0.0.1:6379> get counter"99" 127.0.0.1:6379> decrby counter 50 (integer) 49 127.0.0.1:6379> get counter"49"
注意事项:
incr/decr命令和incrby/decrby命令时间复杂度为O(1)Redis是天然适合做计数器的Redis是单线程的,顺序执行,并发执行incr命令不会有竞争的问题,不会计错数
实战
记录网站每个用户的个人主页的访问量,可以使用如下命令
incr userid:pageview(单线程:无竞争)
说明:假如一个用户的id为123,初始pageview为0,别的用户每浏览一次123用户的主页,pageview自增1,这样每个用户id的访问量就进行了区分。
2.3 set命令和setnx命令
set key value 不管key是否存在,都进行设置 setnx key value key不存在,才进行设置set key value xx key存在才设置
例子:
127.0.0.1:6379> exists python(integer) 1 127.0.0.1:6379> del python(integer) 1 127.0.0.1:6379> exists python(integer) 0 127.0.0.1:6379> set python goodOK127.0.0.1:6379> setnx python good(integer) 0 127.0.0.1:6379> set python base xxOK127.0.0.1:6379> get python"base" 127.0.0.1:6379> exists python(integer) 1 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> exists java(integer) 0 127.0.0.1:6379> setnx java easy(integer) 1 127.0.0.1:6379> set java aaa xxOK127.0.0.1:6379> get java"aaa"
注意事项:
set命令和setnx命令的时间复杂度为O(1)
2.4 mget命令和mset命令
mget key1 key2 key3 批量获取key,原子操作 mset key1 value1 key2 value2 key3 value3 批量设置key-value
例子:
127.0.0.1:6379> mset hello world python best php easyOK127.0.0.1:6379> mget hello python php1) "world" 2) "best" 3) "easy"
注意事项:
1.mget命令和mset命令的时间复杂度为O(n)2.使用get命令获取某个key的值,server端计算后返回对应的值给client端 此时如果想获取n个key的值,需要传输n次,server端也需要计算n次,这样所需要的时间为 n次get = n次网络时间 + n次命令时间3.如果使用mget命令一次传递n个key的值到server端,只需要传输一次,server端计算之后,一次性把计算结果返回给client端 这样所需要的时间为:1次mget = 1次网络时间 + n次命令时间4.在很多场景中,使用mget命令的效率比get命令效率高很多,mget命令后接的key越多效率越明显,但是当key的量很多时,可以对key进行拆分,分批获取key的值,
2.5 getset命令,append命令和strlen命令
getset key newvalue set key newvalue并返回旧的valueappend key value 将value追加到旧的valuestrlen key 返回字符串的长度(注意中文)
例子:
127.0.0.1:6379> set hello world OK127.0.0.1:6379> getset hello python"world"127.0.0.1:6379> append hello ',java'(integer) 11127.0.0.1:6379> get hello"python,java"127.0.0.1:6379> strlen(hello) (error) ERR unknown command 'strlen(hello)'127.0.0.1:6379> strlen hello (integer) 11127.0.0.1:6379> set hello '足球'OK127.0.0.1:6379> strlen hello (integer) 6
注意事项:
getset命令,append命令和strlen命令的时间复杂度为O(1)
2.6 incrby命令,getrange命令和setrange命令
incrbyfloat key float key自增float值 getrange key start end 获取字符串指定下标所有的值 setrange key index value 设置指定下标所有对应的值
例子:
127.0.0.1:6379> incr counter(integer) 50 127.0.0.1:6379> del counter(integer) 1 127.0.0.1:6379> incr counter(integer) 1 127.0.0.1:6379> incrbyfloat counter 1.1"2.1" 127.0.0.1:6379> get counter"2.1" 127.0.0.1:6379> set hello pythonbestOK127.0.0.1:6379> getrange hello 0 6 "pythonb" 127.0.0.1:6379> getrange hello 0 5 "python" 127.0.0.1:6379> setrange hello 6 e(integer) 10 127.0.0.1:6379> get hello"pythoneest"
注意事项:
incrby命令,getrange命令和setrange命令的时间复杂度为O(1)
原文出处:https://www.cnblogs.com/renpingsheng/p/9774352.html
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦