设为首页 收藏本站
查看: 572|回复: 0

[经验分享] Redis数据操作--字符串

[复制链接]

尚未签到

发表于 2018-11-3 11:26:12 | 显示全部楼层 |阅读模式
| 储存文字,储存数字(整数,浮点数),二进制数  
|  字符串操作
  
-- 设置字符串
  
    set key value
  
    # 如果字符串键key已经存在,
  
    那么使用新值覆盖原来的旧值
  
-- 获取字符串
  
    get key
  
    # 返回字符串键key储存的值
  
-- 仅在键不存在的情况下进行设置
  
    setnx key value
  
    # 仅在键key不存在的情况下,将键key的值设置为value,
  
    效果和set key value NX一样。NX的意思为"Not exists"。
  
    # 键不存在并且设置成功时命名返回1;
  
    因为键已经存在而导致设置失败时,命令返回0。
  
-- 同时设置或获取多个字符键的值
  
    mset key value...(key value)
  
    mget key value...(key value)
  
    # 多个get,set同时执行一样
  
-- 一次设置多个不存在的键
  
    msetnx key value [key value...]
  
    # 只有在所有给定键都不存在的情况下,给所有给定键设置值,
  
    效果和同时执行多个setnx一样。如果给定的键至少有一个是
  
    存在的,那么msetnx将不执行任何设置操作。
  
-- 设置新值并返回旧值
  
    getset key new-value
  
    # 将字符串键的值设置为new-value,并返回字符串键在设置新值
  
    之前储存的旧值(old value)。
  
-- 追加内容到字符串末尾
  
    append key value
  
    # 将值value推入到字符串键key已储存内容的末尾
  
-- 返回值得长度
  
    strlen key
  
    # 返回字符串键key储存的值的长度
  
| 键的命名
  
    # 因为Redis的数据不能同时出现两个同名的键,所以
  
    我们通常会使用field1::field2::field3这样的格式来区分
  
    同一类型的多个字符串键。最好统一使用符号。
  
    如:网站用户对应的邮件地址: huangz::email键,peter::email
  
    键来区分。
  
    (也可以选用自己喜欢的其他分隔符)
  
| 字符串索引(正,负)
  
-- 范围设置
  
    setrange key index value
  
    # 从索引index开始,用value复写(overwrite)给定值key
  
    所储存的字符串值。只接受正数索引。
  
    命令返回复写之后,字符串的长度
  
-- 范围取值
  
    getrange key start end
  
    # 返回键key储存的字符串值中,位于start和end两个索引
  
    之间的内容(闭区间),范围取值的索引可以是正数或者负数。
  
| 设置和获取数字
  
    # 只要储存在字符串键里面的值可以被解释为64位整数,或者IEEE-754
  
    的64位浮点数,那么用户就可以对这个字符串键执行对数字值的命令。
  
    # 10086 可以被解释为整数;3.14可以被解释为浮点数;+123可以被解释
  
    为整数;1234....(很多) 值太大,没办法使用64位整数来储存;2.0e7这样
  
    的科学计数法无法被Redis解释;123ABC包含文字,不可以被解释;
  
-- 增加或者减少数字的值(整数)
  
    # 对于一个保存着数字的字符串键key,我们可以使用incrby,decrby命令
  
    来增加或者减少它的值
  
    incrby key increment 将key储存的值加上增量,返回key的值
  
    decrby key increment 将key储存的值减去减量,返回key的值
  
    # 如果执行过程中key不存在,name命令会线将键key初始化为0,
  
    然后再执行增加或者减少操作
  
-- 增一和减一(整数)
  
    incr key 等同于incrby key 1
  
    decr key 等同于decrby key 1
  
    # 因为针对数字值得增一和减一操作非常常见,所以Redis特别创建了这
  
    两个值得命令
  
    (计数器API的实现)
  
    counter.py文件:Counter(name, redis_client), Counter.incr(), Counter.get()
  
    , Count.reset
  
    (id生成器API的实现)
  
    id_generator.py文件:IdGenerator(name, redis_client), IdGenerator.gen()
  
    IdGenerator.int()
  
-- 浮点数的自增和自减
  
    # 为字符串键key储存的值加上浮点数增量increment,返回key值
  
    附:没有响应的decrbyfloat,但可以通过给定负值来达到decrbyfloat
  
    的效果。
  
    redis>set num 10
  
    redis>incrbyfloat num 3.14
  
    redis>incrbyfloat num -2.04
  
    注意事项:即使字符串键储存的是数字值,它也可以执行append、strlen、
  
    setrange的命令,Redis会先将数字值转换成字符串,然后再执行命令
  
| 二进制数据操作
  
-- 设置和获取二进制数据
  
    # set,get,setnx,append等命令设置二进制数据
  
    # 因为Redis自带的客户端redis_cli没办法方便的设置二进制数据
  
    # 所以这里使用Python客户端来进行
  
    >> import redis
  
    >> r = redis.Redis()
  
    >>r.set('bits', 0b10010100)  # 将字符串键bits的值设置为二进制10010100
  
    >>True
  
    >> bin(int(r.get('bits')))  # 获取字符串键bits储存的二进制值(需要进行转换)
  
    >>'0b10010100'
  
    >> r.append('bits', 0b111)  # 将0b111(也即是十进制的7)推入到bits已有
  
    二进制位的末尾
  
    >>4
  
    >> bin(int(r.get('bits')))  # 推入之前的值为0b10010100 =148
  
    '0b10111001111'         # 推入之后的值为0b1011100111 = 1487
  
-- 二进制位的索引
  
    # 和储存文字时的索引不同,当字符串键储存的是二进制位时,二进制的索引
  
    会从左到右依次递减。
  
-- 设置二进制位的值
  
    setbit key index value
  
    # 将给定索引上的二进制位的值设置为value,
  
    命令返回被设置的位原来储存的旧值
  
    redis> setbit bits 2 1
  
    (integer) 0
  
-- 获取二进制位的值
  
    getbit key index
  
    # 返回给定索引上的二进制位的值
  
-- 计算值为1的二进制位的数量
  
    bitcount key [start][end]
  
    # 计算并返回字符串键储存的值中,被设置为1的二进制位的数量
  
    start和end参数的设置,来限制一个范围,可以使用负数值。
  
-- 二进制位的运算
  
    bitop operation destkey key [key ...]
  
    # 对一个或多个保存二进制位的字符串键执行位元操作
  
    ,并将结果保存到destkey上。
  
    operation可以是AND,OR,NOT,XOR
  
    ADN: 对一个或多个key求逻辑并
  
    OR: 对一个或者多个key求逻辑或
  
    XOR: 对一个或多个key求逻辑异或
  
    # 逻辑运算法则:a^b=(a' and b) or (a and b')
  
    NOT: 对给定key求逻辑非
  
    # 命令的返回值为计算结果的字节长度
  
    b:01001101  b2:10110101
  
    redis> bitop and b1-and-b2  # 00000101
  
    (integer) 1
  
    redis> bitop or b1-or-b2 b2  # 11111101
  
    (integer) 1
  
    redis> bitop xor b1-xor-b2 b1 b2  # 11111000
  
    (intefer) 1
  
    redis> bitop not noy-b1 b1  # 10110010
  
    (integer) 1
  
    # 实现在线人数统计 online_count.py
  
    # 使用Redis缓存热门图片
  
    cache= Cache(redis_client)  # 设置缓存的客户端
  
    file = open('reids-logo.jpg', 'r')  # 打开文件
  
    data = file.read()                       # 读取文件数据
  
    file.close()                                 # 关闭文件
  
    cache.put('redis-logo', data)   # 以redis-logo为名字,将图片缓存起来
  
    cache.get('redis-logo')            # 取出redis-logo图片的数据
  
| 储存中文时的注意事项
  
-- strlen,setrange,getrange不适用于中文
  
# 一个英文字符只需要使用单个字节来储存,而一个中文
  
    字符却需要使用多个字节来储存。
  
# strlen,setrange,getrange都是为英文设置的,它们只会
  
    在字符为单个字节的情况下正常工作,而一旦我们储存的
  
    是类似中文这样多字节字符,那这三个命令就不再适用了。
  
-- strlen示例
  
    $ redis-cli --raw  # 在redis-cli中使用中文时,必须打开--raw
  
    选项,才能正常显示中文
  
    redis> set msq '世界你好'
  
    OK
  
    redis> get msg
  
    redis> strlen msg  # 这里strlen显示了'世界你好'的字节长度为12字节
  
    12                           # 但我们真正想知道的是msg键里面包含多少个字符
  
--setrange和getrange示例
  
    setrange和getrange的情况也是类似的:因为这两个命令所使用的索引
  
    是根据字节而不是字符来编排的,所以调用setrange或者getrange来
  
    处理中文,得不到我们想要的结果。
  
--结论
  
    # 不要使用strlen、setrange和getrange来处理中文。
  
    # 例外情况:如果你想知道被储存的中文包含多少个字节,那么可以使用
  
    strlen。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630192-1-1.html 上篇帖子: Redis数据操作--键命令 下篇帖子: Redis数据操作--散列键
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表