redis常用操作

参考: http://www.cnblogs.com/wupeiqi/articles/5132791.html

概述

redis是一个软件

redis是单进程单线程

帮助开发者对一台机器的内存进行操作,

可以做持久化:
  AOF
  RDB

为什么使用redis

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

安装

redis软件

1 yum install redis   (或者编译安装)
2 启动: redis-server /etc/redis.conf
  (如果是编译安装: /src/redis-server redis-conf)

3 redis配置文件: redis.conf
  bind: 0.0.0.0
  port: 6379
  requirepass sdfs (密码)

python连接redis的模块

pip3 install redis

# 创建连接
conn = redis.Redis(host='192.168.1.66', port=6379, password='...')

conn.set('x1', 'val1')
val = conn.get('x1')
print(val)

# 连接池
pool = redis.ConnectionPool(host='192.168.1.66', port=6379, password='123456', max_connections=1000)
conn = reids.Redis(connection_pool=pool)

# 注意: 只用一个连接池, 可以通过单例模式实现(从其他模块导入实例好的连接池对象)

# 使用连接池: 本质是维护一个已经和服务端连接成功的socket; 以后再次发送数据时, 直接获取一个socket, 直接send数据

使用

1 String操作

set(name, value, ex=None, px=None, nx=False, xx=False)        # 设置值,默认,不存在则创建,存在则修改
setnx(name, value)                # 设置值,只有name不存在时,执行设置操作(添加)
setex(name, value, time)          # time,过期时间(数字秒 或 timedelta对象)
psetex(name, time_ms, value)      # time_ms,过期时间(数字毫秒 或 timedelta对象)
mset(*args, **kwargs)             # 批量设置值    如: mset(k1='v1', k2='v2')

get(name)                  # 获取值
mget(keys, *args)          # 批量获取        如:  r.mget('ylr', 'wupeiqi')或    r.mget(['ylr', 'wupeiqi'])
getset(name, value)        # 设置新值并获取原来的值

2 Hash操作(字典操作)

hset(name, key, value)        # name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
hmset(name, mapping)          # 在name对应的hash中批量设置键值对, 如: r.hmset('xx', {'k1':'v1', 'k2': 'v2'})

hget(name,key)                # 在name对应的hash中获取根据key获取value
hmget(name, keys, *args)      # 在name对应的hash中获取多个key的值        如: r.mget('xx', ['k1', 'k2'])    或  r.hmget('xx', 'k1', 'k2')
hgetall(name)                 # 获取name对应hash的所有键值

hincrby(name, key, amount=1)  # 自增name对应的hash中的指定key的值,不存在则创建key=amount        【计数器】 amount可以是负数,实现自减
hlen(name)                    # 获取name对应的hash中键值对的个数
hexists(name, key)            # 检查name对应的hash是否存在当前传入的key

hscan_iter(name, match=None, count=None)    # 利用yield封装hscan创建生成器,实现分批去redis中获取数据        (支持匹配 "hello_*")

3 List操作

lpush(name, values)            # 从左放
rpush(name, values)           # 从右放

lpop(name)         # 从左取一个
rpop(name)         # 从右取一个

lrange(name, start, end)      # 在name对应的列表分片获取数据

blpop(keys, timeout)          # 从左边pop数据, 没有数据会一直等, 如果到了超时时间还没有, 则取回None
brpop(keys, timeout)          # 从右边pop数据, 没有数据会一直等, 如果到了超时时间还没有, 则取回None

lpushx(name,value)            # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
rpushx(name,value)            # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边

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

# 一点一点取, 可以通过yield创建一个生成器

4 Set操作

5 有序集合

其他常用操作

delete(*names)        # 根据删除redis中的任意数据类型
exists(name)          # 检测redis的name是否存在
keys(pattern='*')     # 根据模型获取redis的name
expire(name ,time)    # 为某个redis的某个name设置超时时间

管道(redis事务)

如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

import redis

pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
r = redis.Redis(connection_pool=pool)


pipe = r.pipeline(transaction=True)
pipe.multi()        # 批量操作

pipe.set('name', 'alex')
pipe.set('role', 'sb')

pipe.execute()        # 执行

注意

1 取所有数据时, 先检查一下长度, 如果很多数据, 使用hscan_iter
2 redis操作时, 只有第一层支持数据类型, 如果要嵌套, 先转成json字符串, 再作为值"嵌套"进去

原文地址:https://www.cnblogs.com/sunch/p/10422190.html