zoukankan      html  css  js  c++  java
  • 缓存数据库-redis数据类型和操作(string)

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

    一:String(字符串)

    string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

    string类型是Redis最基本的数据类型,一个键最大能存储512MB。

    redis中的String在在内存中按照一个name对应一个value来存储。如图

       -------------------------------------------------------------------------------------

      1)set(name,value,ex=None,px=None,nx=False,xx=False)

        在Redis中设置值,默认不存在则创建,存在则修改

        ex:过期时间(秒)

        px:过期时间(毫秒)

        nx:如果设置为True,则只有name不存在时,当前set操作才执行

        xx:如果设置为True,则只有name存在时,岗前set操作才执行

       2)setnx(name,value)

        设置值,只有name不存在时,执行设置操作(添加)

        = set(name value,nx=True)

      3)setex(name,value,time)

        # time,过期时间(数字秒 或 timedelta对象

        =set(name,value,ex=time)

      4)psetex(name, time_ms, value)

        # time_ms,过期时间(数字毫秒 或 timedelta对象

         =set(name,value,px=time)

       5)mset(*args, **kwargs)

        批量设置值

        如:mset(k1="v1",k2="v2")

      -----------------------------------------------------------------------------------

      6)get(name) 获取值

      7)mget(keys,*args) 批量获取

        mget(k1,k2)

      8)getset(name,value) 设置新值并获取原来的值

      9)getrange(key,start,end)   获取子序列(根据字节获取,非字符)

        # name,Redis 的 name

        # start,起始位置(字节)

        #end,结束位置(字节)

        比如:“中国” 0-3表示“中”

      10)setranage(name,offset,value) 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)

      11) setbit(name,offset,value) 对name对应值的二进制表示的位进行操作

        

    # 对name对应值的二进制表示的位进行操作
     
    # 参数:
        # name,redis的name
        # offset,位的索引(将值变换成二进制后再进行索引)
        # value,值只能是 1 或 0
     
    # 注:如果在Redis中有一个对应: n1 = "foo",
            那么字符串foo的二进制表示为:01100110 01101111 01101111
        所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
            那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
     
    # 扩展,转换二进制表示:
     
        # source = "武沛齐"
        source = "foo"
     
        for i in source:
            num = ord(i)
            print bin(num).replace('b','')
     
        特别的,如果source是汉字 "武沛齐"怎么办?
        答:对于utf-8,每一个汉字占 3 个字节,那么 "武沛齐" 则有 9个字节
           对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
            11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
            -------------------------- ----------------------------- -----------------------------
                        武                         沛                           齐
    *用途举例,用最省空间的方式,存储在线用户数及分别是哪些用户在线 每个用户都用个ID,用户ID号是多少,就设置第多少位为1,通过bitcount()统计1的个数,就代表有了多少个在线用户
    优点统计速度快,点用空间少:1亿用户只需要占用100M空间 1M=1024*1024

       12)getbit(name,offset) 获取name对应的值的二进制表示中的某位的值 (0或1)

      13) bitcount(key, start=None, end=None) 获取name对应的值的二进制表示中 1 的个数

      14)strlen(name) 返回name对应值的字节长度(一个汉字3个字节)

      15)incr(self, name, amount=1)自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

      16)incrbyfloat(self, name, amount=1.0) 增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

      17)decr(self, name, amount=1)自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。

      18)append(key, value) 在redis name对应的值后面追加内容

       练习查看

     

    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    [BEGIN] 2017/7/29 15:51:31
    [root@kvm2 ~]# redis-cli
    127.0.0.1:6379> set name1 shi  #设置个key-value
    OK
    127.0.0.1:6379> set name2 san
    OK
    127.0.0.1:6379> set name3 jun ex 3 #设置name3过期时间为3秒
    OK
    127.0.0.1:6379> get name3
    (nil)
    127.0.0.1:6379> KEYS *  #查看所有key
    1) "name1"
    2) "name2"
    3) "foo"
    127.0.0.1:6379> set name2  jun nx #不存在则创建,存在则不创建
    (nil)
    127.0.0.1:6379> set name3  jun nx #不存在则创建,存在则不创建
    OK
    127.0.0.1:6379> set name1  111 xx #存在则创建,不存在不创建
    OK
    127.0.0.1:6379> set name4  111 xx #存在则创建,不存在不创建
    (nil)
    127.0.0.1:6379> SETNX name5 222 #不存在则创建,存在则不创建
    (integer) 1
    127.0.0.1:6379> SETNX name5 222
    (integer) 0
    "10"
    127.0.0.1:6379> SETEX name6 3 333 #设置过期时间为3秒 setex key time value
    OK
    127.0.0.1:6379> get name6
    (nil)
    127.0.0.1:6379> PSETEX name7 1 777 #设置过期时间为1毫秒 setex key time value
    OK
    127.0.0.1:6379> MSET k1 "v1" k2 "v2" #批量设置
    OK
    127.0.0.1:6379> keys *
    1) "name1"
    2) "k1"
    3) "name5"
    4) "k2"
    5) "name2"
    6) "name3"
    7) "foo"
    127.0.0.1:6379> mget k1 k2 #批量查看
    1) "v1"
    2) "v2"
    127.0.0.1:6379> GETSET k1 "v3" #设置新值还回旧值
    "v1"
    127.0.0.1:6379> get k1
    "v3"
    127.0.0.1:6379> set k3 "中国"
    OK
    127.0.0.1:6379> GETRANGE k3 0 3 #从那个字节获取,一个中文3个字节
    "xe4xb8xadxe5"
    127.0.0.1:6379> SETRANGE k3 6 1111 #从那个字节设置
    (integer) 10
    127.0.0.1:6379> get k3
    "xe4xb8xadxe5x9bxbd1111"
    127.0.0.1:6379> set n1 "foo"
    OK
    127.0.0.1:6379> setbit n1 7 1  #从左到右第7位设置1
    (integer) 0
    127.0.0.1:6379> get n1
    "goo"
    127.0.0.1:6379> getbit n1 7 #获取第7位是1还是0
    (integer) 1
    127.0.0.1:6379> BITCOUNT n1 0 3 #获取从0-3个字节中转二进制1的个数
    (integer) 17
    127.0.0.1:6379> STRLEN k3 #统计字节个数
    (integer) 10
    127.0.0.1:6379> set n2 1
    OK
    127.0.0.1:6379> INCR n2 #自增
    (integer) 2
    127.0.0.1:6379> INCR n2
    (integer) 3
    127.0.0.1:6379> INCR n2
    (integer) 4
    127.0.0.1:6379> DECR n2 #自减
    (integer) 3
    127.0.0.1:6379> DECR n2
    (integer) 2
    127.0.0.1:6379> INCRBYFLOAT n2 1.0  #按浮点数自增
    "3"
    127.0.0.1:6379> INCRBYFLOAT n2 1.0
    "4"
    127.0.0.1:6379> set n3 4.0
    127.0.0.1:6379> INCRBYFLOAT n3 2.1
    "6.1"
    127.0.0.1:6379> APPEND n3 2222  #追加
    (integer) 7
    127.0.0.1:6379> get n3
    "6.12222"
    
    [END] 2017/7/29 16:05:41
    View Code
  • 相关阅读:
    个人总结05
    微软拼音的用户体验
    个人总结04
    典型用户和用户场景模式
    个人总结03
    个人总结02
    构建之法阅读笔记06
    个人总结01
    学习进度条——第七周
    WebApi学习总结系列第五篇(消息处理管道)
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/7255921.html
Copyright © 2011-2022 走看看