Python_Redis使用

Redis存储(import redis)

  • Redis是一个基于内存的高效的键值型非关系型数据库,存储效率极高,而且支持多种存储数据结构。
  • 连接Reids,键操作,字符串操作,列表操作,集合操作,有序集合操作,散列操作
1、安装
  • windows安装Redis
  • Redis Desktop Manager可视化的下载及安装免费版0.9.3.817 , 介绍
  • linux安装redis,Ubuntu安装redis
    # 安装
    apt-get install redis-server  或者 yum -y install redis
    # 卸载
    sudo apt-get purge --auto-remove redis-server
    # 查看启动
    ps -aux | grep redis
    # 启动
    service redis-server start  或者 	service redis start 
    # 停止
    service redis-server stop  或者 	service redis stop 
    # 连接服务
    redis-cli -h [ip] -p [端口]
    
  • python之redis库,pip install redis
  • 修改远程访问,先修改配置
    vim /etc/redis.conf
    # 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问
    bind 0.0.0.0
    # 守护进程,修改为yes后即可后台运行
    daemonize yes
    # 密码,设置后访问Redis必须输入密码
    requirepass 123456
    #protected-mode(若有)置为no
    protected-mode no
    service redis stop 
    service redis start 
    
2、Python_Redis使用
(1)连接Redis
from redis import StrictRedis
#声明StrictRedis对象
redis = StrictRedis(host='localhost',port=6379,db=0,password=None)
redis.set('name','Bob')
print(redis.get('name'))
#运行结果
#b'Bob'
(2)Redis键操作
from redis import StrictRedis
redis = StrictRedis(host='localhost',port=6379,db=0,password=None)
redis.set('name','Bob')
redis.set('name1','Bob1')
redis.set('name2','Bob2')
redis.set('name3','Bob3')
'''键操作开始'''
redis.exists('name')  # 是否存在name这个键
redis.expire('name',10)  # 将name键的过期时间设置为10秒
redis.ttl('name')  # 获取name这个键的过期时间
redis.delete('name3')  # 删除name3这个键
redis.dbsize()  # 获取当前数据库中键的数目
redis.type('name')  # 判断name这个键的类型
redis.move('name1',2)  # 将name1移动到2号数据库
redis.rename('name2','nickname')  # 将name2重命名为nickname
redis.keys('n*')  # 获取所有已n开头的键
redis.randomkey()  # 获取随机的一个键
redis.flushdb()  # 删除当前选择数据库中的所有键
redis.flushall()  # 删除所有数据库中的所有键
(3)Redis字符串操作
from redis import StrictRedis
redis = StrictRedis(host='localhost',port=6379,db=0,password=None)
'''字符串操作开始'''
redis.set('name','Bob'))  # 将name这个键的value值赋值为Bob
redis.get('name'))  # 返回name这个键的value
redis.setex('name',1,'James')  # 将name键的这个值设为James,有效期为1秒
redis.incr('count',1)  # count对应的值增1,若不存在则创建并设置为1
redis.decr('age',1)  # age对应的值减1,若不存在则创建并设置为-1
redis.mset({'name1':'Durant','name2':'James'})  # 将name1设为Durant,将name2设为James
redis.mget(['name','nickname'])  # 返回name和nickname的value
redis.getset('name','Mike')  # 赋值name值为value并得到上次的value
redis.setnx('newname','James')  # 如果newname这个键不存在,则设置值为James:", redis.setnx('newname','James')
redis.msetnx({'name3':'Smith','name4':'Curry'})  # 在name3和name4均不存在的情况下才设置二者值
redis.setrange('name',6,'World')  # 在name值为4的位置补World
redis.append('nickname','ok')  # 向键为nickname的值后面追加ok
redis.substr('name',1,4)  # 返回键为name的值的字符串没截取索引为1~4的字符
redis.getrange('name',1,4)  # 返回键为name的值的字符串没截取索引为1~4的字符
(4)Redis列表操作(常用)
  • 元素可重复
"""列表操作list"""
from redis import StrictRedis
r = StrictRedis(host='localhost', port=6379, db=1)
url = 'https://www.baidu.com'
url1 = 'https://www.taobao.com'
url2 = 'https://www.sina.com.cn'
r.rpush('list', url, url1, url2)  # 给键list表尾添加1,2,3
for i in range(r.llen('list')):
    t = r.lindex('list', i)
    item = t.decode('utf-8')
    print(item)
    
r.rpush('list', url)  # 给键list尾部添加字段url
r.lpush('list', url)  # 给键list头部添加字段url
r.rpop('list', url)  # 取出键list尾部字段url
r.lpop('list', url)  # 取出键list头部字段url
r.lrange('list', 0, -1)  # 查看键list里面所有的值
r.lrange('list', 0, 2) # 返回键list索引为0终止索引为2的值
r.lrem('list', 2, url)  # 删除键list里面从头开始前面2个值是url的
r.lrem('list', -2, url)  # 删除键list里面从尾部开始倒数的2个值是url的
r.lrem('list', 0, url)  # 删除键list里面所有值是url的
r.llen('list')  # 返回键为list的列表长度
r.lindex('list', 1)  # 返回键为list索引为1的元素
(5)Redis集合操作(常用)
  • 集合中的元素是不重复的
"""集合操作set"""
from redis import StrictRedis
r = StrictRedis(host='localhost', port=6379, db=2)
r.sadd('tags', 'Book', 'Tea', 'Coffee')  # 向键为tags的集合中添加Book、Tea和Coffee这3个内容
for me in r.smembers('tags'):
    item = me.decode('utf-8')
    print(item)
    
r.sadd('tags', 'Book')  # 向键为tags的集合中添值
r.smembers("tags", "Book")  # 判断Book是否是tags的元素
r.srem('tags', 'Book')  # 从键为tags的集合中删除Book
r.scard('tags')  # 获取键为tags的集合中的元素的个数
r.smembers('tags')  # 返回键为tags的集合中所有元素
(6)Redis有序集合操作(常用)
  • 有序集合比集合多了一个分数字段,利用该字段可以对集合中的数据进行排序
"""有序集合操作zset"""
from redis import StrictRedis
r = StrictRedis(host='localhost', port=6379, db=3)
# r.zadd('grade', 100, 'Bob')
(7)Redis散列(哈希)操作(常用)
  • 用name指定散列表的名称,表内存储多个键值对,可进行键定位,值的更新

    """散列操作"""
    from redis import StrictRedis
    r = StrictRedis(host='localhost', port=6379, db=4)
    r.hset('price', 'cake', 5)  # 向键为price的散列表中添加映射关系,cake的值为5
    r.hget('price', 'cake')  # 获取键为price的散列表中键名为cake的值
    r.hgetall('price')  # 键为price的散列表中获取所有映射键值对
    r.hmset('price', {'banana': 2, 'pear': 8})  # 向键为price的散列表中批量添加映射
    r.hkeys('price')  # 从键为price的散列表中获取所有映射键名
    r.hvals('price')  # 从键为price的散列表中获取所有映射键值
    r.hdel("price", "cake")  # 删除键为price的散列表中键名为cake的
    r.hexists("price", "cake")  # 判断键为price的散列表中键名为cake是否存在
    r.hlen('price')  # 从键为price的散列表中获取映射个数
    
  • 其中如果name名称命名中间以冒号的形式,则会归类到一个文件夹里面
    在这里插入图片描述

    在这里插入图片描述

  • 如下代码,是hash的一个应用案例

    import random
    import redis
    
    
    class RedisClient(object):
        """
        redis client
        """
        
        def __init__(self, _type, website, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD):
            """
            init redis client
            :param host: redis host
            :param port: redis port
            :param password: redis password
            """
            self.db = redis.StrictRedis(host=host, port=port, password=password, decode_responses=True)
            self.type = _type
            self.website = website
        
        def name(self):
            """
            get hash name
            :return: name of hash
            """
            return f'{self.type}:{self.website}'
        
        def set(self, username, value):
            """
            set key-value
            :param username: username
            :param value: password or cookies
            :return:
            """
            return self.db.hset(self.name(), username, value)
        
        def get(self, username):
            """
            get value
            :param username: username
            :return:
            """
            return self.db.hget(self.name(), username)
        
        def delete(self, username):
            """
            delete key-value
            :param username: username
            :return: result
            """
            return self.db.hdel(self.name(), username)
        
        def count(self):
            """
            get count
            :return: count
            """
            return self.db.hlen(self.name())
        
        def random(self):
            """
            get random cookies or password
            :return: random cookies or password
            """
            return random.choice(self.db.hvals(self.name()))
        
        def usernames(self):
            """
            get all usernames
            :return: all usernames
            """
            return self.db.hkeys(self.name())
        
        def all(self):
            """
            get all key-values
            :return: map of key-values
            """
            return self.db.hgetall(self.name())
    
    
    
3、RedisDump
  • RedisDump提供了强大的Redis数据的导入和导出功能
  • redis-dump用于导出数据,redis-dump是将redis和json互转的工具
  • redis-load用于导入数据
4、实例函数
(1)连接redis数据库
from redis import StrictRedis


def connect_redis(config: dict, db_index: int):
    """
    连接redis数据库
    :param config:
    :param db_index: 
    :return:
    """
    _db = StrictRedis(
        host=config['host'],
        port=config['port'],
        password=config['auth'], db=db_index)
    return _db


local_config = {
    "host": "localhost",
    "port": 6379,
    "auth": None
}
redis_db = connect_redis(local_config, 0)
(2)存储数据
  • lpush添表头
  • rpush添表尾
from redis import StrictRedis
import json
def save_redis_record(redis_db, key_name, record):
    """
    存储1条数据
    :param redis_db:
    :param key_name: "键名"
    :param record: 数据
    :return:
    """
    # 存储1条数据
    redis_db.lpush(key_name, json.dumps(record, ensure_ascii=False))  # 添表头
    redis_db.rpush(key_name, json.dumps(record, ensure_ascii=False))  # 添表尾
(3)取1条数据
  • lpop添表头
  • rpop添表尾
from redis import StrictRedis
import json
def fetch_redis_record(redis_db, key_name):
    """
    redis取数据
    :param redis_db:
    :param key_name:
    :return:
    """
    data1 = json.loads(redis_db.lpop(key_name))  # 取表首
    data2 = json.loads(redis_db.rpop(key_name))  # 取表尾
(4)取一系列数据
from redis import StrictRedis
import json
def read_range_redis_record(redis_db, key_name, s_index: int, e_index: int):
    """
    读取索引为0终止索引为10的数据
    :param redis_db: 
    :param key_name: 
    :param s_index: 起始索引
    :param e_index: 终止索引
    :return: 
    """
    records = redis_db.lrange(key_name, s_index, e_index)
    for record in records:
        print(json.loads(record))
5、其他机器访问本地redis服务器
  • 首先,修改本地redis.windows.conf文件,第56行的bind 127.0.0.1改为bind 192.168.1.8(查看本机ipv4地址)
    bind 本机ipv4地址
    
  • 接着重启redis服务
    redis-server.exe
    
  • 最后,在另一个尝试连接,比如ubuntu尝试连接windows的redis
    redis-cli -h 192.168.1.8 -p 6379
    
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值