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