当前位置:知识百科 > 正文

django_–_总结_–_redis缓存_django unchained电影

更新时间:2025-01-17 15:40 阅读量:79646

对字典,重新设计结构,增删改查.

hmset? keys? hget? ?scan_iter? hgetall?

import redis
import json

conn = redis.Redis(host='140.143.227.206',port=6379,password='1234')
"""
-----> 第一版
{
luffy_shopping_car:{
    6:{
        11:{
            'title':'21天入门到放弃',
            'src':'xxx.png'
        },
        12:{
            'title':'21天入门到放弃',
            'src':'xxx.png'
        }
    }
}
}
-----> 第二版
{
luffy_shopping_car_6_11:{
    'title':'21天入门到放弃',
     'src':'xxx.png'
},
luffy_shopping_car_6_12:{
    'title':'21天入门到放弃',
     'src':'xxx.png'
},
luffy_shopping_car_6_14:{
    'title':'21天入门到放弃',
     'src':'xxx.png'
}
}
"""
# conn.flushall()

# 添加课程
# redis_key = "luffy_shopping_car_%s_%s" %(7,12,)
# conn.hmset(redis_key,{'title':'21天入门到放弃','src':'xxx.png'})

# 删除课程
# conn.delete('luffy_shopping_car_6_12')
# print(conn.keys())

# 修改课程
# conn.hset('luffy_shopping_car_6_11','src','x1.png')
# print(conn.hget('luffy_shopping_car_6_11','src'))

# 查看所有课程
# print(conn.keys("luffy_shopping_car_6_*"))
# for item in conn.scan_iter('luffy_shopping_car_6_*',count=10):
#     course = conn.hgetall(item)
#     print(course)

# conn.set('k1',123)
# print(conn.type('luffy_shopping_car_6_11'))
# print(conn.type('k1'))

from django.core.cache import cache



# print(conn.keys())
#
# for key in conn.scan_iter("luffy_shopping_car_1*"):
#
#     title = conn.hget(key,'title')
#     img = conn.hget(key, 'img')
#     policy = conn.hget(key, 'policy')
#     default_policy = conn.hget(key, 'default_policy')
#
#
#     print(str(title,encoding='utf-8'))
#     print(str(img,encoding='utf-8'))
#     print(json.loads(str(policy,encoding='utf-8')))
#     print(str(default_policy,encoding='utf-8'))




print(conn.keys())
conn.scan_iter()

print(conn.exists('luffy_sg_car_1_1'))
redis 
http://www.cnblogs.com/wupeiqi/articles/9348938.html
1. redis是什么?
是一个由C语言编写的对内存进行存取数据的软件(NoSQL数据库;非关系型数据库);

2. redis是单进程单线程的.

3. redis基础:
- 5大数据类型;
    - 字符串 
    - 列表 
    - 字典
    - 集合 
    - 有序结合
- 发布和订阅
- 事务 

4. 主从 = 高可用 = HA

服务器A:10.211.55.19
    redis-server  /etc/redis-6379.conf  # 内部bind:0.0.0.0 port: 6379
服务器B: 10.211.55.20
    redis-server  /etc/redis-6379.conf  # 内部bind:0.0.0.0 port: 6379 slaveof: 10.211.55.19
    
    
特殊情况来了:如果主宕机,应该讲从切换成主;
    手动:
        - 登录redis将从变成主
        - 修改代码,将连接字符串IP改成10.211.55.20
    自动:
        - keepalived,监听服务器的状态做高可用;第三方组件;
        - sentinel(哨兵),检测redis主服务器的状态并将所有的slave获取到,一旦主挂掉,则立即将从切换成主;
            redis-sentinel /etc/redis-sentinel-26379.conf(主IP,失败个数)
            redis-sentinel /etc/redis-sentinel-26380.conf
            redis-sentinel /etc/redis-sentinel-26381.conf
            
            Python操作:
                from redis.sentinel import Sentinel
                 
                # 连接哨兵服务器(主机名也可以用域名)
                sentinel = Sentinel([('10.211.55.20', 26379)],socket_timeout=0.5)
                 
                # # 获取主服务器地址
                # master = sentinel.discover_master('mymaster')
                # print(master)
                #
                    # # # 获取从服务器地址
                # slave = sentinel.discover_slaves('mymaster')
                # print(slave)
                #
                    #
                    # # # 获取主服务器进行写入
                # master = sentinel.master_for('mymaster')
                # master.set('foo', 'bar')
                 
                 
                # # # # 获取从服务器进行读取(默认是round-roubin)
                # slave = sentinel.slave_for('mymaster', password='redis_auth_pass')
                # r_ret = slave.get('foo')
                # print(r_ret)
                

总结:
    - 高可用
    - 读写分离

5. 集群=分布式 
如何实现分布式集群:
    - codis,国产 豌豆荚 开源;
    - twemproxy,twitter开源
    - cluster,redis官方提供

redis的cluster的原理?
    16384槽位
    
    服务器A: 0-5000
    服务器B: 5001-10000
    服务器B: 10001 - 16384 
    
Python操作redis cluester:
    redis-py-cluster模块

6. 分布式锁 redlock算法
dlm = Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])
# 如果 my_lock有值,则表示获取锁了
# 如果 my_lock无值,则表示未获取锁,别人获取走了.
my_lock = dlm.lock("my_resource_name",1000)
dlm.unlock(my_lock) # 删除时调用lru脚本
    
redis分布式锁实现原理:
    1. 配置所有要连接的服务器并计算服务器一半的个数;
    
    2. 获取锁:
            - 传入参数:key,内部生成随机字符串,超时时间
            
            - 循环所有服务器,在服务器上设置:
                SET key 随机字符串 NX PX 超时时间  # 如果已经存在则不设置
            
            - 设置成功的个数 >= 一半+1 且 花费时间小于超时时间
            
    3. 释放锁
        - 删除key和value(内部调用lru脚本)
        - 超时释放
    
7. 其他:
- 持久化:
    - AOF,记录所有命令;
    - RDB,指定时间间隔做快照;
- 过期策略 
    voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

    no-enviction(驱逐):禁止驱逐数据
- 不要是直接使用:
    - key
    - all  
    一定要使用scan_iter     

django_–_总结_–_redis缓存

发布者:服务器

订阅者:Dashboad和数据处理

Demo如下:

订阅者:

发布者:

redis重的sentinel主要用于在redis主从复制中,如果master顾上,则自动将slave替换成master

更多参见:https://github.com/andymccurdy/redis-py/

http://doc.redisfans.com/

import redis
import json

conn = redis.Redis(host='140.143.227.206',port=6379,password='1234')
"""
-----> 第一版
{
luffy_shopping_car:{
    6:{
        11:{
            'title':'21天入门到放弃',
            'src':'xxx.png'
        },
        12:{
            'title':'21天入门到放弃',
            'src':'xxx.png'
        }
    }
}
}
-----> 第二版
{
luffy_shopping_car_6_11:{
    'title':'21天入门到放弃',
     'src':'xxx.png'
},
luffy_shopping_car_6_12:{
    'title':'21天入门到放弃',
     'src':'xxx.png'
},
luffy_shopping_car_6_14:{
    'title':'21天入门到放弃',
     'src':'xxx.png'
}
}
"""
# conn.flushall()

# 添加课程
# redis_key = "luffy_shopping_car_%s_%s" %(7,12,)
# conn.hmset(redis_key,{'title':'21天入门到放弃','src':'xxx.png'})

# 删除课程
# conn.delete('luffy_shopping_car_6_12')
# print(conn.keys())

# 修改课程
# conn.hset('luffy_shopping_car_6_11','src','x1.png')
# print(conn.hget('luffy_shopping_car_6_11','src'))

# 查看所有课程
# print(conn.keys("luffy_shopping_car_6_*"))
# for item in conn.scan_iter('luffy_shopping_car_6_*',count=10):
#     course = conn.hgetall(item)
#     print(course)

# conn.set('k1',123)
# print(conn.type('luffy_shopping_car_6_11'))
# print(conn.type('k1'))

from django.core.cache import cache



# print(conn.keys())
#
# for key in conn.scan_iter("luffy_shopping_car_1*"):
#
#     title = conn.hget(key,'title')
#     img = conn.hget(key, 'img')
#     policy = conn.hget(key, 'policy')
#     default_policy = conn.hget(key, 'default_policy')
#
#
#     print(str(title,encoding='utf-8'))
#     print(str(img,encoding='utf-8'))
#     print(json.loads(str(policy,encoding='utf-8')))
#     print(str(default_policy,encoding='utf-8'))




print(conn.keys())
conn.scan_iter()

print(conn.exists('luffy_sg_car_1_1'))
redis 
http://www.cnblogs.com/wupeiqi/articles/9348938.html
1. redis是什么?
是一个由C语言编写的对内存进行存取数据的软件(NoSQL数据库;非关系型数据库);

2. redis是单进程单线程的.

3. redis基础:
- 5大数据类型;
    - 字符串 
    - 列表 
    - 字典
    - 集合 
    - 有序结合
- 发布和订阅
- 事务 

4. 主从 = 高可用 = HA

服务器A:10.211.55.19
    redis-server  /etc/redis-6379.conf  # 内部bind:0.0.0.0 port: 6379
服务器B: 10.211.55.20
    redis-server  /etc/redis-6379.conf  # 内部bind:0.0.0.0 port: 6379 slaveof: 10.211.55.19
    
    
特殊情况来了:如果主宕机,应该讲从切换成主;
    手动:
        - 登录redis将从变成主
        - 修改代码,将连接字符串IP改成10.211.55.20
    自动:
        - keepalived,监听服务器的状态做高可用;第三方组件;
        - sentinel(哨兵),检测redis主服务器的状态并将所有的slave获取到,一旦主挂掉,则立即将从切换成主;
            redis-sentinel /etc/redis-sentinel-26379.conf(主IP,失败个数)
            redis-sentinel /etc/redis-sentinel-26380.conf
            redis-sentinel /etc/redis-sentinel-26381.conf
            
            Python操作:
                from redis.sentinel import Sentinel
                 
                # 连接哨兵服务器(主机名也可以用域名)
                sentinel = Sentinel([('10.211.55.20', 26379)],socket_timeout=0.5)
                 
                # # 获取主服务器地址
                # master = sentinel.discover_master('mymaster')
                # print(master)
                #
                    # # # 获取从服务器地址
                # slave = sentinel.discover_slaves('mymaster')
                # print(slave)
                #
                    #
                    # # # 获取主服务器进行写入
                # master = sentinel.master_for('mymaster')
                # master.set('foo', 'bar')
                 
                 
                # # # # 获取从服务器进行读取(默认是round-roubin)
                # slave = sentinel.slave_for('mymaster', password='redis_auth_pass')
                # r_ret = slave.get('foo')
                # print(r_ret)
                

总结:
    - 高可用
    - 读写分离

5. 集群=分布式 
如何实现分布式集群:
    - codis,国产 豌豆荚 开源;
    - twemproxy,twitter开源
    - cluster,redis官方提供

redis的cluster的原理?
    16384槽位
    
    服务器A: 0-5000
    服务器B: 5001-10000
    服务器B: 10001 - 16384 
    
Python操作redis cluester:
    redis-py-cluster模块

6. 分布式锁 redlock算法
dlm = Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])
# 如果 my_lock有值,则表示获取锁了
# 如果 my_lock无值,则表示未获取锁,别人获取走了.
my_lock = dlm.lock("my_resource_name",1000)
dlm.unlock(my_lock) # 删除时调用lru脚本
    
redis分布式锁实现原理:
    1. 配置所有要连接的服务器并计算服务器一半的个数;
    
    2. 获取锁:
            - 传入参数:key,内部生成随机字符串,超时时间
            
            - 循环所有服务器,在服务器上设置:
                SET key 随机字符串 NX PX 超时时间  # 如果已经存在则不设置
            
            - 设置成功的个数 >= 一半+1 且 花费时间小于超时时间
            
    3. 释放锁
        - 删除key和value(内部调用lru脚本)
        - 超时释放
    
7. 其他:
- 持久化:
    - AOF,记录所有命令;
    - RDB,指定时间间隔做快照;
- 过期策略 
    voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

    no-enviction(驱逐):禁止驱逐数据
- 不要是直接使用:
    - key
    - all  
    一定要使用scan_iter     

django_–_总结_–_redis缓存

以上就是迅悦小常识小编为大家整理的django_–_总结_–_redis缓存相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!