首页 > 数据库 >python学习 - 操作redis数据库常用指令 案例

python学习 - 操作redis数据库常用指令 案例

时间:2024-06-16 09:58:36浏览次数:14  
标签:name python 数据库 redis hash1 key print self dbconn

# -*- coding:UTF-8 -*-
import redis
import time


class TestRedis:
    def __init__(self):
        self.dbconn = None

    def openRedis(self):
        # 连接redis,加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。
        # r = redis.Redis(host=u'127.0.0.1', port=6379, db=0)
        pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, decode_responses=True)  # 使用连接池
        self.dbconn = redis.Redis(connection_pool=pool)

    def addKey(self, Key, Value):
        self.dbconn.set(Key, Value)

    def getKey(self, Key):
        return self.dbconn.get(Key)

    def setObj(self, name, value, ex=None, px=None, nx=False, xx=False):
        #   ex,过期时间(秒)
        #   px,过期时间(毫秒)
        #   nx,如果设置为True,则只有name不存在时,当前set操作才执行
        #   xx,如果设置为True,则只有name存在时,当前set操作才执行
        self.dbconn.set(name, value, ex=ex, px=px, nx=nx, xx=xx)
        pass

    def exAndpxDemo(self):
        # 演示过期时间, ex :秒 , px : 毫秒
        self.setObj("apple", "一个", ex=2)
        print self.getKey("apple")
        time.sleep(3)
        print self.getKey("apple")
        print "======================"
        self.setObj("banana", "two", px=2)
        print self.getKey("banana")
        time.sleep(0.3)
        print self.getKey("banana")

    def nxAandxxDemo(self):
        #   nx,如果设置为True,则只有name不存在时,当前set操作才执行 (新建)
        #   xx,如果设置为True,则只有name存在时,当前set操作才执行 (修改)
        self.addKey('grape', 'zhangsan')
        self.setObj("grape", "一个", nx=True)
        self.setObj("grape2", "一个2", nx=True)
        print self.getKey("grape")  # 此时是 zhangsan 并没有改为 一个
        print self.getKey("grape2")  # 此时是 一个2
        print "========================"
        self.setObj("grape2", "修改了", xx=True)  # grape2已经存在
        print self.getKey("grape2")  # 此时是 修改了
        self.setObj("grape3", "修改了", xx=True)  # grape3不存在 不会创建
        print self.getKey("grape3")  # None

    def listGet(self):
        # 将目前redis缓存中的键对应的值批量取出来
        print(self.dbconn.mget("grape", 'grape2'))
        print(self.dbconn.mget(['grape', 'grape2']))

    def getset(self):
        # 设置新值并获取原来的值
        print(self.dbconn.getset("grape", "aaa"))
        print(self.dbconn.getset("grape", "bbb"))

    def listSet(self):
        self.dbconn.mget({'k1': 'v1', 'k2': 'v2'})
        self.dbconn.mset(k1="v1", k2="v2")  # 这里k1 和k2 不能带引号 一次设置对个键值对

        opt = {
            "one": "aaa",
            "two": "bbb",
            "three": "ccc",
            4: 4
        }
        self.dbconn.mset(opt)

        print(self.dbconn.mget("k1", "k2"))  # 一次取出多个键对应的值
        print(self.dbconn.mget("one", "two", "three", 4))

    def addClick(self):
        self.dbconn.set("foo", 123)
        print(self.dbconn.mget("foo", "foo1", "foo2", "k1", "k2"))
        self.dbconn.incr("foo")  # 124
        self.dbconn.incr("foo")  # 125
        self.dbconn.decr("foo")  # 自减 124

        print(self.dbconn.mget("foo", "foo1", "foo2", "k1", "k2"))
        self.dbconn.set("foo1", "123.0")

        # 浮点型
        self.dbconn.set("foo1", "123.0")
        self.dbconn.set("foo2", "221.0")
        print(self.dbconn.mget("foo1", "foo2"))
        self.dbconn.incrbyfloat("foo1", amount=2.0)
        self.dbconn.incrbyfloat("foo2", amount=3.0)
        print(self.dbconn.mget("foo1", "foo2"))

    def hash(self):
        opt = {
            "sasa": {
                "v1": "1a",
                "v2": "2a"
            }
        }
        opts = {
            "v1": "1a",
            "v2": "2a"
        }

        self.dbconn.hset("hash1", "k2", "v2")
        self.dbconn.hmset("hash1", opt)
        self.dbconn.hmset("hash1", opts)

        # print(self.dbconn.hkeys("hash1"))                 # 取hash中所有的key
        # print(self.dbconn.hget("hash1", "k1"))            # 单个取hash的key对应的值
        # print(self.dbconn.hmget("hash1", "k1", "v3"))     # 多个取hash的key对应的值

        self.dbconn.hsetnx("hash1", "k3", "v3")    # 只能新建
        # print(self.dbconn.hkeys("hash1"))         # 取hash中所有的key

        print(self.dbconn.hget("hash1","k2"))            # 单个取出"hash2"的key-k2对应的value
        print(self.dbconn.hmget("hash1", "k2", "k3"))   # 批量取出"hash2"的key-k2 k3对应的value --方式1
        print(self.dbconn.hmget("hash1", ["k2", "k3"])) # 批量取出"hash2"的key-k2 k3对应的value --方式2

        print(self.dbconn.hgetall("hash1"))  #   获取name对应hash的所有键值
        print(self.dbconn.hlen("hash1"))     #   获取name对应的hash中键值对的个数
        print(self.dbconn.hkeys("hash1"))    #   获取name对应的hash中所有的key的值
        print(self.dbconn.hvals("hash1"))    #   获取name对应的hash中所有的value的值

        #检查name对应的hash是否存在当前传入的key
        print(self.dbconn.hexists("hash1", "k4"))  # False 不存在
        print(self.dbconn.hexists("hash1", "k1"))  # True 存在

        #删除键值对
        print(self.dbconn.hgetall("hash1"))
        self.dbconn.hset("hash1", "k1","v222")  # 修改已有的key k2
        self.dbconn.hset("hash1", "k11", "v1")  # 新增键值对 k11
        self.dbconn.hdel("hash1", "k11")         # 删除一个键值对
        print(self.dbconn.hgetall("hash1"))

        # 自增自减整数(将key对应的value - -整数
        # 自增1或者2,或者别的整数
        # 负数就是自减)
        # hincrby(name, key, amount=1)
        # 自增name对应的hash中的指定key的值,不存在则创建key = amount
        # 参数:
        # name,redis中的name
        # key, hash对应的key
        # amount,自增数(整数)

        self.dbconn.hset("hash1", "k3", 123)
        self.dbconn.hincrby("hash1", "k3", amount=-1)
        # print(self.dbconn.hgetall("hash1"))
        print(self.dbconn.hget("hash1", "k3"))  # 单个取出"hash2"的key-k3对应的value
        self.dbconn.hincrby("hash1", "k4", amount=1)  # 不存在的话,value默认就是1 print(r.hgetall("hash1"))
        print(self.dbconn.hget("hash1", "k4"))  # 单个取出"hash2"的key-k3对应的value

        #浮点数
        self.dbconn.hset("hash1", "k5", "1.0")
        self.dbconn.hincrbyfloat("hash1", "k5",amount=-1.0)  # 已经存在,递减-1.0
        self.dbconn.hincrbyfloat("hash1", "k6", amount=-1.0) # 不存在,value初始值是-1.0 每次递减1.0

        # 取值查看 - -分片读取
        # hscan(name, cursor=0, match=None, count=None)
        # 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆
        # 参数:
        # name,redis的name
        # cursor,游标(基于游标分批取获取数据)
        # match,匹配指定key,默认None
        # 表示所有的key
        # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
        # 如:
        # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
        # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
        # 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
        print(self.dbconn.hscan("hash1"))

        # hscan_iter(name, match=None, count=None)
        # 利用yield封装hscan创建生成器,实现分批去redis中获取数据
        # 参数:
        # match,匹配指定key,默认None
        # 表示所有的key
        # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
        # 如:

        for item in self.dbconn.hscan_iter('hash1',match=None, count=None):
            print(item)

        print(self.dbconn.hscan_iter("hash1"))  # 生成器内存地址

    def redisList(self):
        # self.dbconn.lpush("list1", 44, 55, 66)    # 表示从左向右操作
        # print(self.dbconn.lrange('list1', 0, -1)) #切片取出值,范围是索引号0到-1(最后一个元素)

        # self.dbconn.rpush("list2", 44, 55, 66)  # 表示从右向左操作
        # print(self.dbconn.llen("list2"))  # 列表长度
        print(self.dbconn.lrange("list2", 0, -1))  # 切片取出值,范围是索引号0-3

        # 往已经有的name的列表的左边添加元素,没有的话无法创建
        # lpushx(name, value)
        # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边




    def main(self):
        r = self.openRedis()
        # self.dbconn.append("name", "haha")  # 在name对应的值junxi后面追加字符串haha
        # print(self.dbconn.mget("name"))

        self.addKey('grape', 'zhangsans')    # 添加
        # print self.getKey('grape')           # 获取
        # self.exAndpxDemo()
        # self.nxAandxxDemo()
        # self.listGet()
        # self.getset()                      #设置新值并获取原来的值
        # self.listSet()                      #批量设置值
        # self.addClick()                       #自增自减

        # redis基本命令 hash
        # self.hash()

        #redis基本命令 list
        self.redisList()

# 将目前redis缓存中的键对应的值批量取出来

if __name__ == '__main__':
    # r = redis.Redis(host='127.0.0.1', port=6379)
    # r.flushdb()
    # print r.dbsize()
    # r.set('foo', 'Bar')manager
    # print r.get('foo')https://gitee.com/DanBrown/Ordermeal.git

    testredis = TestRedis()
    testredis.main()

标签:name,python,数据库,redis,hash1,key,print,self,dbconn
From: https://blog.csdn.net/weixin_tank88921/article/details/139598749

相关文章

  • 成为MySQL DBA后,再看ORACLE数据库(十、事务与隔离级别)
    一、事务控制语句事务控制方式在ORACLE和MySQL中有着明显的不同,在ORACLE数据库中,当第一条可执行的SQL语句开始执行时,就隐性地开始了一个事务,然后继续执行随后的SQL语句,直到出现以下情况:1.commit,如果事务遇到commit语句,此前的所有更改将在数据库中永久生效;2.rollback,如果事务遇到......
  • 怎么把Python脚本打包成可执行程序exe文件?
    需求分析最近根据用户提的需求用python做了一个小工具,但是在给客户使用的时候不能直接发送python文件,毕竟让客户去安装python环境,那就离了大谱了。所以这时候就需要把多个py文件带着运行环境打包成EXE可执行文件。技术实现这里以window为例,Mac是同样的道理。一、检测脚......
  • python入门级经典交互式小程序
    今天学习做一个简单的交互式小程序知识点:1.对空列表进行添加元素,并分别打印每次添加的元素2.给while设置参数法进行循环3.for循环结合range()进行循环代码如下:klist=[]name=input("请输入你喜欢的明星:")while(name):  klist.append(name)  name=input......
  • 2024华为OD机试真题-堆内存申请-(C++/Python)-C卷D卷-100分
    2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)题目描述有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为:优先紧接着前一块已使用内存,分配空间足够且最接近申请大小的空闲内存。输入描述第1行是1个整数,表示期望申请的内存字节数第2到第N行是用空格......
  • 2024华为OD机试真题-围棋的气-(C++/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。“气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相......
  • Python自动化测试框架-pytest
    源码:https://github.com/pytest-dev/pytest文档:https://docs.pytest.org/en/8.2.x/安装:pipinstallpytest简单样例#contentoftest_sample.pydefinc(x):returnx+1deftest_answer():assertinc(3)==5命令行执行python可以看到执行结果命名规范......
  • 数据库系统
    数据库基本概念概念数据:是数据库中存储的基本对象,是描述事物的符号记录。数据的种类:文本、图形、图像、音频、视频数据库(DB):是长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库的基本特征数据按一定的数据模型组织、描述和存储可为各种用户共享冗余度较......
  • python实验:图书管理
    使用Python语言完成读者管理功能的开发,要求该功能至少包括:输出读者管理主菜单、添加读者信息、删除读者信息、修改读者信息、显示所有读者信息。要求:1、每一条读者信息存储到一个字典类型变量中2、所有读者信息使用列表类型变量存储。导模块图书信息管理系统启动后,首先进......
  • gbase8s数据库阻塞检查点和非阻塞检查点的执行机制
    1.检查点的描述为了便于数据库系统的复原和逻辑恢复,数据库服务器生成的一致性标志点,称为检查点,其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动如果存在检查点,数据库只需要完成检查点之后的逻辑日志的恢复......
  • 数据库MySQL——从0到1入门教程
    Q:为什么需要MySQL?A:网络服务中,我们需要存储、管理大量的数据,并确保数据的安全、实现增删改查操作的高效,因此需要一个系统用来专门管理数据,以实现上述的高性能要求,数据库管理系统应需而生八股如下:数据持久性:数据库能够持久化存储数据,确保数据在系统关闭或崩溃后依然存在......