zoukankan      html  css  js  c++  java
  • 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')
    
    # 应用于抢购和刷新火车票的
  • 相关阅读:
    深度学习与爬虫实例教学--深度学习模型构建和训练
    深度学习与爬虫实例教学--项目基本介绍和体验
    正负样本比率失衡SMOTE
    重建主键索引为非压缩索引
    最小二乘法-公式推导
    极大似然估计(MLE)
    我的新博客地址http://xxxbw.github.io/
    javascript方法--bind()
    javascript方法--call()
    javascript方法--apply()
  • 原文地址:https://www.cnblogs.com/Skyda/p/9651621.html
Copyright © 2011-2022 走看看