• python操作Redis缓存


    python操作Redis缓存

    https://www.cnblogs.com/guotianbao/p/8683037.html

    学习资料: 电子书资源 

    联系邮箱:gmu1592618@gmail.com

    flask微电影: movie_project 

    正文

    一、Redis的安装

      xshell连上服务器,依次输入以下代码:

    1
    2
    3
    4
    wget http://download.redis.io/releases/redis-3.0.6.tar.gz
    tar xzf redis-3.0.6.tar.gz
    cd redis-3.0.6
    make

      如果不巧发生以下截图中的错误:

      说明未安装gcc,如果是centos系统,输入:yum install gcc安装gcc即可,然后再次输入make执行。

      输入make后,很不幸,再次发生如下截图错误:

      推测是因为编译库的问题。

      将make改为make MALLOC=libc 再次运行!好事多磨。

         终于安装成功了!

      还有配置文件的修改什么的先不折腾了,此时已然可以启动Redis服务

    1
    2
    3
    4
    5
    6
    7
    8
    src/redis-server # 启动服务端
     
    # 启动客户端的代码如下
    src/redis-cli
    redis> set foo bar
    OK
    redis> get foo
    "bar"

         看到上面的图像,说明服务端已经起来了!

      但是看到很多WARNING,没错,此时你用pycharm写了连接redis服务端的代码,但是你发现服务端竟然没有响应

      OK,在服务端Ctrl + C ,先把服务断开

      分别执行下面的语句:

    1
    2
    3
    4
    echo 511 /proc/sys/net/core/somaxconn
    echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
    sysctl vm.overcommit_memory=1
    echo never > /sys/kernel/mm/transparent_hugepage/enabled

      在/etc下的rc.local的最后添加:

    1
    echo never > /sys/kernel/mm/transparent_hugepage/enabled

      最后的重点来了,折腾半天还是服务器不鸟我,无奈之下试了试临时关闭防火墙:

    1
    service iptables stop 

      唉呀呀,终于成功了!

      我在另一台服务器用了另一种搭建方法:传送门也成功了,但是也不要忘记要临时关掉防火墙。

     

    二、Redis的两种连接方式

    1.简单连接
    1
    2
    3
    4
    5
    import redis
    conn = redis.Redis(host='207.148.120.229', port=6379)
    conn.set('foo''Bar')
    print(conn.get('foo'))
    = input('按任意键结束')

    2.使用连接池  

      为了减少每次建立、释放连接的开销,推荐使用连接池

      redis使用connection pool来管理对一个redis服务的所有连接。

      多个redis实例可共享一个连接池。

    1
    2
    3
    4
    5
    6
    7
    import redis
    pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
    conn = redis.Redis(connection_pool=pool)
     
    conn.set('key''Hello World')
    print(conn.get('key'))
    = input('按任意键结束')

    三、五大数据类型

    1.String操作  

      redis中的String在在内存中按照一个key对应一个value来存储。以键值对的方式存储。

     

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

       mset(*args, **kwargs) 批量设置值

     View Code

      get(name)  获取值

    print(conn.get('k1'))

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

     View Code

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

     View Code

      getrange(key, start, end)  获取name对应value的指定字节

     View Code

      setrange(name, offset, value) 从指定字节开始替换新值

     View Code

      strlen(name) 获取name对应的value的长度

     View Code

      incr(self, name, amount=1) name存在,则自增amount,否则设置name的value值为amount

     View Code

      decr(self, name, amount=1) 自减(整数)

     View Code

         append(key, value)

     View Code

    2.Hash操作

     

      hset(name, key, value)  设置值

     View Code 

      hmset(name, mapping) 批量设置值

     View Code

      hmget(name, keys, *args) 获取多个值

     View Code

      hgetall(name)  获取name对应hash的所有键值

     View Code

      hlen(name)  获取name对应的hash中键值对的个数

      hkeys(name)  获取name对应的hash中所有的key的值 

      hvals(name)  获取name对应的hash中所有的value的值

      hdel(name,*keys)  将name对应的hash中指定key的键值对删除

      hincrby(name, key, amount=1)  自增(整数)

     View Code

      hincrbyfloat(name, key, amount=1.0) 自增(浮点数)

      hscan(name, cursor=0, match=None, count=None)   增量式迭代获取

     View Code

      hscan_iter(name, match=None, count=None)

     View Code

    3.List操作

      lpush(name,values)  

     View Code

      lpushx(name,value)

     View Code 

      llen(name)  name对应的list元素的个数

      linsert(name, where, refvalue, value))

     View Code 

      r.lset(name, index, value)

     View Code 

      r.lrem(name, value, num)

     View Code 

      lpop(name)

     View Code

      lindex(name, index)  在name对应的列表中根据索引获取列表元素

      lrange(name, start, end)

     View Code 

      ltrim(name, start, end)

     View Code 

      rpoplpush(src, dst)

     View Code 

      blpop(keys, timeout)

    复制代码
    # 将多个列表排列,按照从左到右去pop对应列表的元素
     
    # 参数:
        # keys,redis的name的集合
        # timeout,超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞
     
    # 更多:
        # r.brpop(keys, timeout),从右向左获取数据
    复制代码

      brpoplpush(src, dst, timeout=0)

     View Code

      自定义增量迭代

     View Code

    4.Set操作

      Set集合就是不允许重复的列表

      sadd(name,values)  name对应的集合中添加元素

      scard(name)  获取name对应的集合中元素个数

      sdiff(keys, *args)  在第一个name对应的集合中且不在其他name对应的集合的元素集合

      sdiffstore(dest, keys, *args)  获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中

      sinter(keys, *args)  获取多一个name对应集合的并集

      sinterstore(dest, keys, *args)  获取多一个name对应集合的并集,再讲其加入到dest对应的集合中

      sismember(name, value)  检查value是否是name对应的集合的成员

      smembers(name)    获取name对应的集合的所有成员

      smove(src, dst, value)  将某个成员从一个集合中移动到另外一个集合

      spop(name)  从集合的右侧(尾部)移除一个成员,并将其返回

      srandmember(name, numbers)  从name对应的集合中随机获取 numbers 个元素

      srem(name, values)  在name对应的集合中删除某些值

      sunion(keys, *args)  获取多一个name对应的集合的并集

      sunionstore(dest,keys, *args)  获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中

      sscan_iter(name, match=None, count=None)  同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大

    5.有序集合

      在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。

      zadd(name, *args, **kwargs)  在name对应的有序集合中添加元素

     View Code

      zcard(name)  获取name对应的有序集合元素的数量

      zcount(name, min, max)  获取name对应的有序集合中分数 在 [min,max] 之间的个数

      zincrby(name, value, amount)   自增name对应的有序集合的 name 对应的分数

     View Code

      r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

     View Code

      zrank(name, value)  

     View Code

      zrangebylex(name, min, max, start=None, num=None)

     View Code

      zrem(name, values)

     View Code

      zremrangebyrank(name, min, max)  根据排行范围删除

      zremrangebyscore(name, min, max)  根据分数范围删除

      zremrangebylex(name, min, max)  根据值返回删除

      zscore(name, value)  获取name对应有序集合中 value 对应的分数

      zinterstore(dest, keys, aggregate=None)

     View Code

      zunionstore(dest, keys, aggregate=None)

     View Code

      zscan_iter(name, match=None, count=None,score_cast_func=float)  同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作

    6.其他常用操作

      delete(*names)  根据name删除redis中的任意数据类型

      exists(name)  检测redis的name是否存在

      keys(pattern='*')

     View Code

      expire(name ,time)  为某个redis的某个name设置超时时间

      rename(src, dst)  对redis的name重命名

      move(name, db)  将redis的某个值移动到指定的db下

      randomkey()  随机获取一个redis的name(不删除)

      type(name)  获取name对应值的类型

      scan(cursor=0, match=None, count=None)

      scan_iter(match=None, count=None)  同字符串操作,用于增量迭代获取key

    四、管道

      redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

     View Code

    五、发布和订阅

      发布者:服务器

      订阅者:Dashboad和数据处理

      Demo如下:

     RedisHelper

      订阅者:

     View Code

      发布者:

     View Code
  • 相关阅读:
    JavaScript打印99乘法表
    Python列表推导式玩法
    Python错误重试方法
    pandas + jupyter进行数据处理
    新手小白的爬虫神器-无代码高效爬取数据
    Adb连接模拟器出现版本错误
    Python发送多人邮件报错
    Django入门
    git clone 下载速度解决办法
    Python实现自动刷抖音
  • 原文地址:https://www.cnblogs.com/hanbowen/p/10068971.html
Copyright © 2020-2023  润新知