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()