本文已参与「新人创作礼」活动,一起开启掘金创作之路。
总结:Redis是什么?
-
是一个完全开源免费的key-value内存数据库
-
通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
1 redis 是什么?
通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等 等,分类的标准也不以,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数 据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT) 等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。
2 Redis 用来做什么?
通常局限点来说,Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在Redis之中,期间也包扩Storm对于Redis列表的读取和更新。
3 为什么要用Redis?
1,解决了应用服务器的CPU和内存压力
2,减少IO的读操作,减轻IO的压力
3,关系型数据库的扩展性不强,难以改变表结构
4 Redis 的优点
1,性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
2,丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3,原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
4,丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
5,数据库之间没有关联关系,数据结构简单,扩展表比较容易
6,数据同时保存在内存和磁盘上,可以进行快读的保存和读取操作,保存在硬盘的数据不会消失,可以恢复
5 Redis 的缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis 基础知识:
1,端口号:6379
2,redis默认是16个数据库,下标从0开始
3,单线程的:redis是单线程+IO多路复用,检查文件描述的就绪状态。
4,redis支持的数据类型:string,set,list,hash,zset。
Redis不是什么?
- 不是sql server、mySQL等关系型数据库,主要原因是:
. redis目前还只能作为小数据量存储(全部数据能够加载在内存中) ,海量数据存储方面并不是redis所擅长的领域
. 设计、实现方法很不一样.关系型数据库通过表来存储数据,通过SQL来查询数据。而Redis通上述五种数据结构来存储数据,通过命令 来查询数据
2. 不是Memcached等缓存系统,主要原因有以下几个:
.网络IO模型方面:Memcached是多线程,分为监听线程、worker线程,引入锁,带来了性能损耗。Redis使用单线程的IO复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
.内存管理方面:Memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 Redis更适合作为存储而不是cache
.数据的一致性方面:Memcached提供了cas命令来保证.而Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断
. 存储方式方面:Memcached只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能
Redis 有什么用?只有了解了它有哪些特性,我们在用的时候才能扬长避短:
-
速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
-
持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
-
自动操作:对不同数据类型的操作都是自动的,很安全
-
快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
-
Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。
Redis 命令:
1 ,key操作:
| keys * | 查看当前库所有的键 |
|---|---|
| exists | 判断是否存在key |
| del | 删除某个键 |
| expire | 设置键过期时间 单位是s秒 |
| ttl | 查看还有多少秒过期 -1表示用不过期 -2表示已经过期 |
| move | 把键移到另一个库下 |
| dbsize | 查看数据库key的数量 |
| flushdb | 清空当前库 |
| flushall | 通杀所有库 |
2 ,String类型:String是二进制安全的,可以包含任何数据源,最大512m
| get | 查看对应的键值 |
|---|---|
| set | 添加键值对 |
| append | 将给定的value 追加到原值的末尾 |
| strlen < key > | 获取值得长度 |
| setnx | 当key 不存在的时候设置key值 |
| incr | 将key中储存的数字加1,如果为空,则值为1 |
| decr | 将key中储存的数字减1,如果为空,则值为-1 |
| incrby/decrby <步长> | 将key中的数字增减 |
3 ,String批量处理:
| mset | 同时设置多个键值对 |
|---|---|
| mget <key 2> | 同时获得多个值 |
| msetnx | 当给定的key都不存在 |
| getrange | 类似sunstring |
| setrange | 类似sunstring覆盖原始值 |
| setex <过期时间> | 设置键值的同时,给定过期时间 |
| getset | 以旧换新,设置了新的值同时得到旧值 |
4 ,List:链表
特点:
单键多值
Redis列表是简单的字符串列表,从左或者从右插入
底层是双向链表,对两端的操作性能很高,通过下标查询性能很低
| lpush/rpush .. | 从左或从右插入多个值 |
|---|---|
| lpop/rpop | 从左边或右边吐出一个值,值光键亡 |
| rpoplpush | 从key1 右边吐出一个值到key2的左边 |
| lrange | 按照索引下标获取元素 从左到右 |
| lindex | 按照索引下标获取元素 从左到右 |
| llen 获取列表长度 | 获取列表长度 |
| linsert before | 在key中value前插入newvalue |
5 ,Set:类似list的无序集合,保证列表中不会有重复数据,底层是一个value为null的hash表
| sadd | 将多个元素加入到key中,重复值忽略 |
|---|---|
| smembers | 取出该集合的所有值 |
| sismember | 判断集合key中是否有该value值 有就1 没有0 |
| scard | 返回该集合的元素个数 |
| srem | 删除集合中的某个元素 |
| spop | 随机吐出该集合一个值 |
| srandmember | 随机从集合中取出n个值,不会从集合中删除 |
| smove | 将key1中的value 移动到key2 中 |
| sinter | 返回两个集合的交集元素 |
| sunion | 返回两个集合的并集 |
6 ,hash:键值对集合,类似map<String,Object>
| hset | 给key 集合中的file 键赋值value |
|---|---|
| hget | 从key1 集合file取出value |
| hmset | 批量设置hash的值 |
| hexists | 查看key中的field 是否存在 |
| hkeys | 列出key中所有的filed |
| hvals | 列出该hash集合中所有的value |
7 ,zset:与set集合非常相似,每个成员都关联了score,可以用来排序
| zadd | 将一个或多个元素以及score加入zset |
|---|---|
| zrange withscore | 返回下标在区间内的集合,带有score |
| zrangebyscore [withscore] [limit offset count] | 返回key中 score介于min和max中的成员,升序排列 |
| zrevrangerbyscore [withscore] [limit offset count] | 降序 |
| zincrby | 在key集合中的value上增加increment |
| zrem | 删除key集合下的指定元素 |
| zcount | 统计 区间内的元素个数 |
| zcord | 获取集合中的元素个数 |
| zrank | 查询value在key中的排名,从0开始 |
8 ,Redis的事务管理:
输入multi,输入的命令都会依次进入到队列中,但不会执行,直到输入exec,redis会将之前命令队列中的命令依次执行,通过discard可以放弃组队。
主要作用: 序列化操作,串联多个命令防止别的命令插队
悲观锁: 每次拿到数据的时候都会上锁,或者等待别人处理完再去拿锁,传统的关系型数据库里边很多用到了这种锁机制,比如行锁、表锁、读锁、写锁
乐观锁:每次拿数据的时候总认为别人不会修改数据,所以不会上锁。但是更新的时候回去判断别人有没有更改数据,使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。
Redis 使用乐观锁: redis就是利用check-and-set机制实现事务
三大特性:
1,单独的隔离操作:事务中的所有命令都会序列化,按顺序执行。不会被其他客户端打断
2,没有隔离级别概念:队列中的命令没有提交之前不会被执行,事务外不能查看事务内的更新
3,不能保证原子性:跳过错误,依旧执行,没有回滚