redis 基础应用

 
 
 
redis 安装
   -redis安装  
  -window的安装
  -redis支持5大数据类型
    -字符  Memcached 只支持字符串类型
    -列表
    -字典
    -集合
    -有序集合  
  -可以持久化,单线程,单进程(10w)

  -py操作reddis

    
-安装模块pip3 install redis
 
  redis链接:
import redis

# 拿到一个redis链接
coon = redis.Redis(host='127.0.0.1',port=6379)

# pool为单例模式 连接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)

# 从链接池 去一个链接
conn = redis.Redis(connection_pool=pool)



redis字符串操作

# ex,过期时间(秒)
# px,过期时间(毫秒)
# nx,如果设置为True,则只有name不存在时,当前set操作才执行,反之则不执行
# xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,反之不进行更新
conn.set('name', 'egon', nx=True)



import datetime
v=datetime.timedelta(weeks=2)
ctime=datetime.datetime.now()
ctime+v

# 设置值,只有name不存在时,执行设置操作(添加),如果存在,不会修改 过期时间为5秒
conn.setex('ttt', 5,'xxx')


# 批量插入
conn.mset({"k1": 'v1', "k2": 'v12', "k3": 'v3'})

# 可自动识别列表
value1=conn.mget('name','k1','k2')
value2=conn.mget(['name','k1','k2'])

# 设置新值并获取原值
print(conn.getset('name','xxxxxx'))

# 获取子序列(开始字节 结束字节)
conn.getrange('name',1,2)

# 修改字符串内容(指定索引后替换)
conn.setrange('name', 1, 'eerrrrrrrrrrrrrrrr')

# 查询对应值字节长度
print(conn.strlen('name'))

# 自增(需要在此之前set)
conn.incr('age',-4)

# 追加 在name中追加内容
conn.append('name','0000000')


redis字典操作

# 插入或修改字典
conn.hset('person','age','18')

# 批量插入字典
conn.hmset('person2',{'age':'19','name':'egon','xx':'xx'})

# 在name对应的hash中获取根据key获取value
print(conn.hget('person','name'))

# 在name对应的hash中获取多个key的值
print(conn.hmget('person2',['age','name','xx']))

# 获取name对应hash的所有键值
print(conn.hgetall('person'))

# 获取name对应的hash中键值对的个数
print(conn.hlen('person'))

# 获取name对应的hash中所有的key的值
print(conn.hkeys('person'))

# 检查name对应的hash是否存在当前传入的key
print(conn.hexists('person','nameee'))

# 将name对应的hash中指定key的键值对删除
conn.hdel('person2','name','age')

# 自增name对应的hash中的指定key的值,不存在则创建key=amount
conn.hincrby('person','age')

for i in range(1000000):
conn.hmset('person2',{'eeeeee%s'%i:i})
# 如果数据量不大,自动全取出来
cour2 = 0
count = 1
while True:
cour2, data2 = conn.hscan('person2', cursor=cour2, match=None, count=3000)
count += len(data2)
if cour2 == 0:
break
# 不用getall的方式取,用这种方式取,也能把所有数据取出来,但是不会吧内存撑爆
data=conn.hscan_iter('person2', match=None, count=100)
# 内部有915371条数据
# 先去取100条
# 做成了生成器
# 取值的时候,100以内,没有再去查,用的是生成器
# 当超过一百,再去取100条.做成了生成器
for i in data:
print(i)





redis操作列表


# 添加元素在列表的最左边
conn.lpush('list','2')

# 添加元素在列表的最右边
conn.rpush('list','3')

# 只有name已经存在时,值添加到列表的最左边
conn.lpushx('list2','3')

# 列表list元素个数
print(conn.llen('list'))

# 在列表list 第三个值前/后插入一个新值
conn.linsert('list', 'after', "3", '444444')
conn.linsert('list', 'before', "3", '5555555')

# 对列表中索引值进行重新赋值
conn.lset('list',4,'66666666')

# 删除指定值
conn.lrem('list',0,"3")

# 删除列表左(右)侧第一个值并返回该值
print(conn.lpop('list'))
print(conn.rpop('list'))

# 按索引取值,支持负索引
print(conn.lindex('list',-2))

# 将多个列表排列,按照从左到右去pop对应列表的元素
# 可以用于简单的分布式爬虫
print(conn.blpop('list'))

# 批量插入数据
conn.lpush('list',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])

# 在list对应的列表元素分片获取数据
print(conn.lrange('list',0,-1))

# 自定义列表的增量迭代
def scan_list(name,count=2):
index=0
while True:
data_list=conn.lrange(name,index,count+index-1)
if not data_list:
return
index+=count
for item in data_list:
yield item
# print(conn.lrange('test',0,100))
for item in scan_list('list',5):
print(item)




redis模拟事物
# 事务(不支持事务,但是通过管道模拟)
conn=redis.Redis(host='127.0.0.1', port=6379)

# # 拿到一个管道,transaction=True表示管道内部都是原子性
pi=conn.pipeline(transaction=True)

# # 说明是批量命令
pi.multi()
pi.set('xx','xxx')
pi.set('yy','yyy')
pi.execute()

redis其他操作

# 其它操作
conn.delete('name1')

# 根据key值模糊查询
print(conn.keys('k*'))

# 对redis中的某一个name设置超时时间
exprie(name,time)

# # 将多个列表排列,按照从左到右去pop对应列表的元素
print(conn.type('person'))






 
 
 
 
 
posted @ 2018-11-21 15:07  路口有雾  阅读(254)  评论(0编辑  收藏  举报