redis学习汇总
- 互联网背景下,为什么用NoSql
- nosql是什么?
- nosql能干嘛?
- 3V+3高
- 当下的NoSQL经典应用
- nosql数据模型简介
- nosql数据库四大分类
- 在分布式数据库中CAP原理CAP+BASE
- 分布式+集群
- redis与其他kv缓存相比有以下三个特点
- redis的安装
- redis启动后的杂项基础知识
- redis的五大数据类型
- 哪里去获得redis常见数据类型操作命令
- 解析配置文件redis.conf
- redis常见配置redis.conf
- Redis持久化之RDB(Redis DataBase)
- Redis持久化之AOF(Append Only File)
- RDB & AOF which one
- Redis的事务(部分支持)
- Redis的发布订阅
- Redis的复制(Master/stave)
- Redis的python客户端
互联网背景下,为什么用NoSql
一、单机MySql
当一个网站的访问量不大时,用单个数据库完全可以轻松应付。
在那个时候,更多的都是静态网页,动态交互类型的网站不多。
上述架构下,我们来看看数据存储的瓶颈是什么?
1.数据量的总大小 一个机器放不下时
2.数据的索引(B+ Tree)一个机器的内存放不下时
3.访问量(读写混合)一个实例不能承受
如果满足了上述1 or 3个,进化…
二、Memcached(缓存)+Mysql+垂直拆分
后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。
Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端
三、MySql主从复制读写分离
由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
四、分库分表+水平拆分+Mysql集群
在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。
同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证。
五、Mysql的扩展性瓶颈
MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
六、为什么用Nosql
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。下面给大家看一下,web应用数据量的增长图:
nosql是什么?
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
nosql能干嘛?
1.易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。
数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
2.大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。
这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
3.多样灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
3V+3高
大数据时代的3V:海量Volume、多样Variety、实时Velocity。
互联网需求的3高:高并发、高可扩(横向)、高性能。
当下的NoSQL经典应用
一、阿里巴巴架构的发展历程
1、演变过程
2、第五代架构
3、第五代架构使命
二、商品基本信息
为什么去IOE
三、 商品描述、详情、评价信息(多文字类)
四、商品的图片
五、商品的关键字
六、商品的波段性的热点高频信息
七、 商品的交易、价格计算、积分累计
总结大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案
nosql数据模型简介
聚合模型
KV键值
Bson(类似json串的数据表达和描述)
列组
图形
nosql数据库四大分类
KV键值
文档形数据库,类似Bson(类似json串的数据表达和描述),例如mongodb(基于分布式文件存储数据库)
列组数据库
图形数据库
四者对比
在分布式数据库中CAP原理CAP+BASE
传统的ACID分别是什么?
A(atomicity)原子性
C(consistency)一致性
I(isolation)独立性
D(durability)持久性
CAP
C:(consistency)强一致性
A(availability)可用性
P(partition tolerance)分区容错性
CAP3进2
BASE
基本可用(basically available)
软状态(soft state)
最终一致性(eventually consistent)
上图说白了就是牺牲C实现AP,最终通过BASE实现一致性
分布式+集群
redis与其他kv缓存相比有以下三个特点
1、redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
2、redis不仅支持简单的kv类型的数据,同时还提供list,set,zset,hash等数据结构的存储
3、redis支持数据的备份,即master-slave模式的数据备份
redis的安装
Linux版安装
下载获得redis-6.0.5.tar.gz后将它放入我们的Linux目录/opt/software
/opt/software目录下,解压命令:tar -zxvf redis-6.0.5.tar.gz -C /opt/module
解压完成后出现文件夹:redis-6.0.5
在redis-6.0.5目录下执行make命令
在编译redis6.0.1之前需要升级gcc的版本,默认情况yum安装的gcc版本是4.8.5,由于版本过低,在编译时会报如下错误(部分截取)。
若不想编译安装gcc高版本,这里推荐一种yum安装的方式。
1、安装scl源
yum install centos-release-scl scl-utils-build
2、列出scl可用源
yum list all --enablerepo='centos-sclo-rh'
3、安装8版本的gcc、gcc-c++、gdb工具链(toolchian)
yum install -y devtoolset-8-toolchain
scl enable devtoolset-8 bash
gcc --version
如果make完成后继续执行make install
查看默认安装目录:usr/local/bin
将redis的配置文件redis.conf拷贝到/zxl/myredis下
cp /opt/moudle/redis.conf /zxl/myredis
修改配置文件redis.conf
补充wim小知识
移动到行后shift+$
启动
redis-server /zxl/myredis/redis.conf
redis-cli -p 6379
关闭
shutdown
redis启动后的杂项基础知识
1、 单进程
2、默认16个数据库,类似数组下标从0开始,初始默认使用0号库(select命令切换数据库,例如select 7)
3、dbsize查看当前数据库的key的数量
4、flushdb:清空当前库
5、flushall:通杀全部库
6、统一密码管理,16个库都是同样密码,要么都OK,要么一个也连接不上
redis的五大数据类型
String(字符串)
Hash(哈希,类似python里的字典)
List(列表)
Set(集合)
Zset(sorted set:有序集合)
哪里去获得redis常见数据类型操作命令
http://redisdoc.com/
redis键(key)
常用命令
keys *
exists key ----------->判断某个key是否存在
move key db-------->当前库就没有了,被移除了
expire key 秒钟:为给定的key设置过期时间
ttl key : 查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key :查看你的key是什么类型
python连接redis服务
安装pyredis
pip install redis
import redis
redis_config = {
"host": "192.168.1.133",
"port": 6379
}
# redis连接对象
redis_conn = redis.Redis(**redis_config)
redis_conn.set("name","ping")
print (redis_conn.get("name"))
redis字符串(String)
常用命令
set/get/del/append/strlen
incr/decr/incrby/decrby,一定要是数字才能进行加减
getrange key 0 -1/setrange key 0 xxxx
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx获取多个键值,插入多个键值
getset(先get再set)
redis列表(List)
常用命令
lpush/rpush/lrange--->从左插入,从右插入,查询列表
lpop/rpop--------------->一次弹出一个(从左,从右)
llen----------------------->列表的长度
lrem key---------------->删除n个value
ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush 源列表 目的列表
lset key index value
linsert key before/after 值1 值2
性能总结
它是一个字符串链表,left、right都可以插入添加
如果键不存在,创建新的链表
如果键已经存在,新增内容
如果值全部移除,对应的键也就消失了
链表的操作无论是头还是尾效率都极高,但假如是对中间元素进行操作,效果就很惨淡了
redis集合(set)
常用命令
sadd/smembers/sismember
scard,获取集合里面的元素个数
srem key value 删除集合中的元素
srandmember key 某个整数 -->随机出几个数
spop key 随机出栈
smove key1 key2 在key1里的某个值 --》作用是将key1里的某个值赋给key2
数学集合类
差集:sdiff k1 k2 key1里面有key2里面没有的
交集:sinter
并集:sunion
redis哈希(hash)
常用命令
hset/hget/hmset/hmget/hgetall/hdel
hlen
hexists key 在key里面存在的某个值的key
hkeys/hvals
hincryby/hincrbyfloat
hsetnx
redis有序集合Zset(sorted set)
常用命令
zadd/zrange (withscores)
zrangebyscore key 开始score 结束score
withscores
( 不包含
limit 作用是返回限制(limit 开始下标 多少步)
zrem key 某score下对应的value值,作用是删除元素
zcard/zcount key score区间/zrank key value值,作用是获得下标值/zscore key 对应值,获得分数
zrevrank key value值,作用是逆序获得下标值
zrevrange
zrevrangebyscore key 结束score 开始score
解析配置文件redis.conf
在Linux下开发,配置大于开发
vim 知识小补充
显示行号 :set nu