数据存储的瓶颈:(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

---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') # 应用于抢购和刷新火车票的

redis----Not only Sql 理论的更多相关文章

  1. 【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)

    公众号链接 最高级的红酒,一定要掺上雪碧才好喝. 基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法.既然redis号称nosql,而我偏要把SQL加到redis上, ...

  2. 一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL

    本文说明:除开ES,Solr,sphinx系列的其他开源搜索引擎汇总于此.   A search engine based on Node.js and LevelDB A persistent, n ...

  3. 使用redis+lua实现SQL中的select intersect的效果

    公众号文章地址 1.需求 业务中需要实现在两个集合中搜索数据,并返回交集. 用SQL的伪代码可以描述如下: select key from set1 where sorted_key between ...

  4. SQL 理论知识总结

    1..如何设计数据库 答:存储信息的大小,每次扩容的大小,冗余 2.SQL Server的两种索引是何形式?索引的作用?索引的优缺点? 答:集聚索引,非聚集索引.提高查询速度.但是会过多的占用磁盘空间 ...

  5. 互联网公司面试必问的Redis题目

    Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...

  6. Redis来啦~~

    一. 先聊点别的 1. sql & nosql sql指关系型数据库,如Oracle,MySQL等,nosql泛指非关系型数据库,如MongoDB,Redis等:SQL数据存在特定结构的表中, ...

  7. Basic Tutorials of Redis(7) -Publish and Subscribe

    This post is mainly about the publishment and subscription in Redis.I think you may subscribe some o ...

  8. Redis 数据库入门指南

    Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库.缓存和消息代理使用.Redis 支持丰富的数据结构,有:字符串(Strings).哈希(Hashs).列表(Lists).集合(Se ...

  9. Redis与Java - 实践

    Redis与Java - 实践 标签 : Java与NoSQL Transaction Redis事务(transaction)是一组命令的集合,同命令一样也是Redis的最小执行单位, Redis保 ...

随机推荐

  1. Salt之CentOS7.5使用RPM包安装MySQL5.7.22

    手动安装参考CentOS7.5使用RPM包安装MySQL5.7.22 目录结构为 install.sls文件 #按顺序分别安装commin libs client server #避免冲突安装comm ...

  2. Spring Aop(三)——Pointcut表达式介绍

    转发地址:https://www.iteye.com/blog/elim-2395255 3 Pointcut表达式介绍 3.1 表达式类型 标准的Aspectj Aop的pointcut的表达式类型 ...

  3. linux如何添加服务为系统服务快速启动或关闭

    当在linux系统安装了一些服务比如apache,mysql,iptables等等后想快速启动或者重启 但是在使用系统启动或者关闭服务时候发现输入指令 >service httpd restar ...

  4. javaweb期末项目-stage2-项目创建、配置、接口设计和功能实现(含核心源码)

    项目的创建.配置.接口设计和功能实现(含核心代码).rar--下载 说明:解压密码为袁老师的全名拼音(全小写) 相关链接: 项目结构:https://www.cnblogs.com/formyfish ...

  5. 查看创世区块 Genesis Block和channel.tx文件

    将 Block 详细内容导入到 json 文件查看 configtxgen -inspectBlock channel-artifacts/genesis.block > genesis.blo ...

  6. 02.02 lamp环境搭建笔记

    lamp环境 在linux中安装 apache.mysql.php三种软件环境,同时需要安装他 某些插件. cp /etc/apt/sources.list /etc/apt/sources.list ...

  7. 使用socket.io实现双向实时消息传递,(客服聊天功能)

    思否 https://segmentfault.com/a/1190000010974426 博客园 https://www.cnblogs.com/limitcode/p/7845168.html ...

  8. Memcache分布式锁

    在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限 下面通过一个简单例子介绍: 这里引用的是Memcached.ClientLibrary.d ...

  9. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

  10. 提取json字符串中指定格式中的参数值

    直接上代码: import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; p ...