• Redis基础使用


    Redis:Redis(REmote dictionary server)是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的key-value型数据库。value的值可以是 string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(sorted set-有序集合) 等类型。

    ANSI:ANSI是一种字符代码,为使计算机支持更多语言,通常使用0x000x7f范围的1个字节来表示1个英文字符,超出此范围的使用0x800xFFFF来编码,即扩展的ANSCII编码。

    BSD协议:BSD是Berkeley Software Distribution的缩写。BSD开源协议是一个给予使用者很大自由的协议:可以自由使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

    Mac平台安装Redis

    Redis下载地址 https://redis.io/download 下载最新版本并安装。

    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    tar xzf redis-5.0.5.tar.gz
    cd redis-5.0.5
    make
    

    make结束后 redis-5.0.5 目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序都位于安装目录src下。
    接下来启动redis服务

    cd src
    ./redis-server
    

    这种启动方式使用的是默认配置,可以通过指定配置文件作为启动参数的方式启动redis。

    cd src
    ./redis-server xxx/etc/redis.conf
    

    也可以使用内置的客户端与Redis进行交互

    src/redis-cli
    127.0.0.1:6379> set name tony
    OK
    127.0.0.1:6379> get name
    "tony"
    

    若使用redis-cli方式启动redis,则退出可直接输入quit进行退出

    127.0.0.1:6379> quit
    

    若是使用redis-server方式启动可用下面方式关闭服务。

    src/redis-cli -h 127.0.0.1 -p 6379 shutdown
    

    Python操作Redis

    1.安装redis模块

    pip3 install redis
    

    2.Python的redis模块提供两个类Redis和StrictRedis用于实现Redis的命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis模块。
    创建一个Python脚本文件 redis_test.py

    #!/usr/bin/env python
    
    import redis
    
    
    def test_redis():
        # 连接redis
        r = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True)
        r.set("name", "python")
        print(r.get("name"))
    
    
    if __name__ == '__main__':
        test_redis()
    
    

    3.Python的redis模块使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认每个Redis实例都会维护一个自己的连接池。可以建立一个连接池,然后将连接池作为参数传给Redis,就可以实现多个Redis实例共享一个连接池。

    #!/usr/bin/env python
    
    import redis
    
    
    def test_redis():
        # 连接redis
        conn_pool = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True)
        r = redis.Redis(connection_pool=conn_pool)
    
        # set()方法给key设置value,不存在则创建,存在则修改
        # set(name. value, ex=None, px=None. nx=False, xx=False)
        # ex-过期时间(秒)
        # px-过期时间(毫秒)
        # nx-若设置为True,则只有name不存在时,当前set操作才执行
        # xx-若设置为True,则只有name存在时,当前set操作才执行
        r.set("name", "python")
    
        # setex() psetex()和set中ex一样,可以设置过期时间
        # setex(name, time, value) time单位为秒
        # psetex(name, time_ms, value) time_ms单位为毫秒
        r.setex("address", 100, "beijing")
        r.psetex("hobby", 100, "game")
    
        # mset(mapping) 批量设置值
        r.mset({"k1":"v1", "k2":"v2"})
    
        # setrange() 从指定字符串索引开始向后替换字符串内容
        # setrange(name, offset, value) offset-字符串的索引
        r.setrange("name", 2, "l")
    
        # append(key, value) 往key里追加内容
        r.append("name", "isgood")
    
        # get(name) 获取值
        r.get("name")
    
        # mget(keys, args) 批量获取
        r.mget("name", "address")
        
        # getset(name, value) 设置新值并获取原来的值
        r.getset("name", "tom")
    
        # getrange(key, start, end) 根据字节获取
        # 若value是汉字,一个汉字占3个字节,如:"北京市" 0-3结果为"北"
        r.getrange("name", 0, 3)
    
        # strlen(name) 返回name对应值得字节长度(一个汉字3个字节)
        r.strlen("name")
    
        # incr(name, amount=1) incrbyfloat(name, amount=1.0)
        # name对应的value自增,若name不存在,则value初始化为amount
        # incrbyfloat() 的amount值为浮点型
        r.incr("age", amount=1)
    
        # decr(name, amount=1)
        # name对应的value自增,若name不存在,则value初始化为: 0-amount
        r.decr("age", amount=1)
        
        # list
        # llen(name) 返回name对应的list的length
        r.llen("students")
    
        # lpush(name, values) 在name对应的list中添加元素
        r.lpush("students", 2, 3)
    
        # lpushx(name, value) 当name存在时,将value添加到列表最左边
        r.lpushx("stuentds", "ccd")
    
        # insert(name, where, refvalue, value)
        # 将value插入name中refvalue的前边或者后边 where的值为after或者before
        # 如果refvalue不在name中将返回-1
        r.linsert("students", "after", 2, 6)
    
        # lset(name, index, value)
        # 更改列表name中指定下标的值
        r.lset("students", 2, "l")
    
        # lrem(name, count, value)
        # 删除列表name中指定的value值
        # count>0 从左到右删除
        # count<0 从右到左删除
        # count=0 删除所有等于value的值
        r.lrem("students", 2, 6)
    
        # lpop(name) 删除并返回列表name的第一个元素
        r.lpop("students")
    
        # lindex(name, index) 返回列表中指定索引位置的元素,支持负索引
        r.lindex("students", 3)
    
        # lrange(name, start, end) 返回列表name位于start和end之间的切片
        # start 和 end可以是负数,类似python中切片的负索引
        r.lrange("students", 0, -1)
    
        # ltrim(name, start, end)
        # 裁剪列表:移除列表中不在start和end之间的所有值
        r.ltrim("students", 2, -1)
    
        # rpoplpush(src, dst)
        # 取出列表src最右边的元素放入列表dst的最左边,并返回这个元素
        r.rpoplpush("students", "teachers")
    
    
    if __name__ == '__main__':
        test_redis()
    
    

    本文作者:温茶又折花

    本文链接: https://www.cnblogs.com/dyfblogs/p/14961392.html

    转载文章请注明作者和出处,谢谢!
  • 相关阅读:
    第二阶段--个人冲刺--第七天
    学习进度条12
    第二阶段--个人冲刺--第六天
    第二阶段--个人冲刺--第五天
    第二阶段--个人冲刺--第四天
    第二阶段--个人冲刺--第三天
    从小工到专家阅读笔记03
    团队冲刺第一阶段第十天
    团队冲刺第一阶段第九天
    构建之法阅读笔记05
  • 原文地址:https://www.cnblogs.com/dyfblogs/p/14961392.html
Copyright © 2020-2023  润新知