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
---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 理论的更多相关文章
- 【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)
公众号链接 最高级的红酒,一定要掺上雪碧才好喝. 基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法.既然redis号称nosql,而我偏要把SQL加到redis上, ...
- 一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL
本文说明:除开ES,Solr,sphinx系列的其他开源搜索引擎汇总于此. A search engine based on Node.js and LevelDB A persistent, n ...
- 使用redis+lua实现SQL中的select intersect的效果
公众号文章地址 1.需求 业务中需要实现在两个集合中搜索数据,并返回交集. 用SQL的伪代码可以描述如下: select key from set1 where sorted_key between ...
- SQL 理论知识总结
1..如何设计数据库 答:存储信息的大小,每次扩容的大小,冗余 2.SQL Server的两种索引是何形式?索引的作用?索引的优缺点? 答:集聚索引,非聚集索引.提高查询速度.但是会过多的占用磁盘空间 ...
- 互联网公司面试必问的Redis题目
Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...
- Redis来啦~~
一. 先聊点别的 1. sql & nosql sql指关系型数据库,如Oracle,MySQL等,nosql泛指非关系型数据库,如MongoDB,Redis等:SQL数据存在特定结构的表中, ...
- 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 ...
- Redis 数据库入门指南
Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库.缓存和消息代理使用.Redis 支持丰富的数据结构,有:字符串(Strings).哈希(Hashs).列表(Lists).集合(Se ...
- Redis与Java - 实践
Redis与Java - 实践 标签 : Java与NoSQL Transaction Redis事务(transaction)是一组命令的集合,同命令一样也是Redis的最小执行单位, Redis保 ...
随机推荐
- matlab学习——01线性规划
01线性规划 format compact; % min fx % Ax<=b % Aeq*x=beq % lb<=x<=ub % % max z=2x1+3x2-5x3 % x1+ ...
- 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码
import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...
- Linux信号、信号处理和信号处理函数
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可 ...
- CockroachDB学习笔记——[译]在CockroachDB中如何让在线模式更改成为可能
原文链接:https://www.cockroachlabs.com/blog/how-online-schema-changes-are-possible-in-cockroachdb/ 原作者: ...
- CockroachDB学习笔记——[译]Hello World
原文链接:https://www.cockroachlabs.com/blog/hello-world/ 原作者:Spencer Kimball 原文日期:Jun 4, 2015 译:zifeiy 数 ...
- paramiko实现putty功能
paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. context:python3.5 执行命令 1.基于用户名和密码方 ...
- 【ABAP系列】SAP ABAP替代校验全解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP替代校验全解析 ...
- 在win10上使用premake工具和vs2017编译运行Box2D源码和Testbed
1.从github上下载Box2D源码的zip包 2.解压缩zip包 3.从premake网站下载premake5工具,解压后得到premake5.exe 4.将premake5.exe拷贝到Box2 ...
- Java基础——接口和抽象类
接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...
- XSS 攻击的预防
XSS 攻击有两大要素: 1.攻击者提交恶意代码. 2.浏览器执行恶意代码. 针对第一个要素:我们是否能够在用户输入的过程,过滤掉用户输入的恶意代码呢? 输入过滤 在用户提交时,由前端过滤输入,然后提 ...