redis----Not only Sql 理论

数据存储的瓶颈:(mysql ==>500万数据就已经很慢了)

  1 数据量的总大小,一个机器放不下时

  2 数据 的索引,一个机器的内存放不下时

  3 访问量(读写混合),一个实例不能承受

Redis的优点:
支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
支持简单的事务需求,但业界使用场景很少,并不成熟。

Redis的局限性:
Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。

Mc和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难。

1 秒可以写 8万左右,

    读 11万左右

3V 

  1 海量

  2 多样

  3 实时

3 高

  1 高并发

  2 高可扩

  3 高性能

 NOsql 

  kv 键值   redis

  文档型数据库  mongodb

  列存储数据库  分布式文件系统

  图关系数据库  放的是关系比,如:朋友圈社交网络 ,广告推荐系统

分布式数据库中CAP原理CAP+BASE:

  传统的ACIP

       A 原子性

        事物里所有操作 第全部做完,要么都不做,事务成功是所有操作都成功

      C 一致性

        数据库要一直处于一致状态,事务的运行不会改变数据库原本的一致性结束

      I   独立性

        指并发的事物之间不会相互影响,如果有一个事务要访问的数据已在被另一个事务修改,只要另一个事务未得奖,它所访问的数据就不会受未提交事务的影响

      D   持久性

        一旦事务提交后,它做的修改将会永远保存在数据库上,即使出现宕机也不会丢失。

  NOSQL  CAP

      C  强一致性 

      A  可用 性

      P  分区容错性

      (通常在分布式存储系统中,P是必须要实现的)(AP通常用于大多数网站架构的选择)

分布式系统:

  分布式:

    不同的多台服务器上面部署不同的服务模块(工程),他们之间通过RPC/RMI之间通信和调用,对外提供服务和组内协作

  集群:

    不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的高度,对外提供服务和访问

    

    


redis 

  1 单线程,通过对epoll函数包装来做到的

  2 默认16个数据库,类似数组,表从0开始,默认使用0库

  3 select :切换数据库

   keys * :选出所有的key

   flushdb:清空当前库

   dbsize :查看当前 数据库的key的数量

      flushall:清空所有库

 数据类型:

  1 子符串

    一个键对应 一个值,是二进制安全的,可心包含任何数据,如jpg图片 

    一个redis中字符串值最多可以是512M

  2 集合

    是子符类型的无序集合,通过hash table实现

  3 列表

    简单的子符串列表,按照插入顺序排序,它的底层实际上是一个链表

  4 哈希

    键值对集合,是一个字符类型的field 和 value的映射表,hash特别适合用于存储对象

    5 有序集合

    字符类型元素的集合,不允许重复,每个元素都会关联一个double类型的分数,通过分数来排序,但是分数可以重复

key:

  keys * 查看所有的key

  exists + key名 判断是否存在某个key

  move key名 + 库名 从当前库移动到另一个库

  expire key + 秒钟    为给定的key设置过期时间

  ttl key 查看还有多少秒过期,-1 表示永不过期,-2表示已过期

  tyep key 查看key的类型

  delete key 删除键

  set k1 v1 添加键值(若键存在,则会覆盖)

string:

  单值单value

    append  键值2  在原键对应值后加上值2

    strlen 键  返回键值中的个数

    incr 键 原来键值逐渐加1

    decr 键  原来键值逐渐减1

    incrby 键+数值a   ....加a

    decrby 键+数值a  .....减a

    getrange 键+范围 :获取指定区间范围内的值 (0~ -1 表示全部,类似于索引)

    setrange 键+‘索引’ +值 范围为设置(修改值)

    setex(set with expire) 键+秒 + 值 :设置过期时间

    setnx(set if not exist ) 键+ 值:若键不存在,则设置,若存在 则无效(起效为1,无效为0)

    mset 键1 值1 键2 值2 。。。同时设置多个

    mget 键1 键2 ...同时获取多个

    msetnx 键1 值1 键2 值2 ...若部分存在  则也无效

list:

  单key多value

  lpush + key + v1 v2 v333(可重复) 将值从右边依次放入列表中

  rpush + key + v1 v2 v3         左边

  lrange + key + 范围   从列表的左侧开始显示

  lpop + key 将列表中的最左侧的值返回

  rpop + 列表名 ....最右侧的值返回 (并从列表中传出)

  lindex + key + 索引 按照索引下标获取元素

  llen + key :列表的长度

  lren + key + 个数 + value 删除N个键

  ltrim + key + 开始index + 结束index 截取指定范围值后再同赋值列表

  rpoplpush + 源列表 + 目的列表 :源列表最后一个放到目的列表第1 个

  lset key index value 修改列表中的值

  linsert key before/after 值1 值2    在值1前/后插入值2

set 

  单key 多value 

  sadd key 值1 值2 值3 在集全中加入(自动去重)

  smemkers key  索引范围 查看集合内容

  sismemker key 值 :判断值是否在集合中,是返回1 ,否返回0

  scard + key 获取集合中有多少个元素

  srem key value 删除集合中元素

  srandmember key 某个整数(随机出个几个数)

  spop key 随机一个元素出栈

  smove key1 key2 + key 里的某个值 将key1 里的某个值赋给key2 

  数字集合类:

    sdiff:差集   sdiff key 1 key2 在key1里不存在key2 里

    sinter 交集  sinter key1 key2 

    sumon 并集  sumon key1 key2

hash :

  kv 模式不变,但value 是一个键值对

  hash key field value

    键     (域    值)

  hset + key + value   (此处value 必须为键值对) 创建哈希

  hget + key + 子key   返回子key的值

  hmset + key + v1 v2 v3  多个值

  hmget +key + 子key1 + 子key2   多

  hgetall + key   将所有的value返回

  hdel key 子key    删除value

  hlen key   哈希的长度 (有1 无0)

  hexists key 子key   判断value 里的某个key 是否存在

  hkeys key   返回value 中的所有子key

  hvals key   返回value 中所有子key对应的值

  hincrby key 子key n   将子key 对应的值加n

  hincrbyfloat key 子key n(小数)     同上

  hsetnx key value   不存在放入hash ,存在则无效

  hvals key   返回所有子键对应的值

 redis有序集合

  1 向有序集合添加一个或多个成员,或者更新已存在成员分数

    ZADD key score1 member1 score2 member2

    ZADD SC 2 w 5 a 1 s

  2 获取有序集合的成员数

    ZCARD key 

    ZCARD SC

  3 向有序集合中指定成员分数加上增量

    ZINCRBY key increment member

    ZINCRBY SC s 6 

  4 通过索引区间返回有序集合内成员

    ZRANGE key start end [WITHSCORES]

    ZRANGE SC 0 -1 [WITHSCORES]

  5 移除有序集合中指定成员

    ZREM key member

    ZREM SC s

  6 获取指定成员分数

    ZSCORE key member

    ZSCORE SC w

    

Redis 事务

  一次执行多个指令

  重要:

    批量操作在发送执行命令前被放入队列缓存收到执行命令,事务被执行,

    事务中任何一条命令执行失败,其余的命令仍然会被执行

    事务执行过程中其他客户端提交的命令请求不会被插入事务中

1   MULTI  开启一个事务 

2  命令入列................

3       EXEC 执行事务

MULTI
set g ggggg
set m  mmmmmmm
get g 
get m
EXEC
View Code---Demo

管道:

  pip = r.pipeline(transaction=True)

  pip.set('k1','v1')

  pip.set('k2','v2')

  pip.get('k1')

  time.sleep(3)

  pip.execute

  print(r.get('k1'))


django中使用redis

  pip3 install django-redis

CACHE = {

  'default':{

  'BACKEND':'django_redis.cache.RedisCache',

  'LOCATION':'127.0.0.1:6379',

  'OPTIONS':{'CLIENT_CLASS':'django_redis_client.Default'}

}

REDIS_TIME=7*24*60*60

CUBES_REDIS_TIMEOUT=60*60

NEVER_REDIS_TIMEOUT=365*24*60*60

from django.core.cache import cache #这就是redis的缓存对象

#****************************
from  import cache_page
@cache_page(10) #10秒之内缓存页面
def a(request):
    print('@@@@')
    return render(request,'xxx.html')

# 应用于抢购和刷新火车票的