1.1.1redis介绍
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可 基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的 开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
redis能做什么?
1. 内存存储,持久化,断电即丢失,所以持久化很重要,redis采用两种机制(RDB和AOF)
2. 效率高,可以用于高速缓存
3. 发布订阅系统
4. 地图信息分析
5. 计数器等,网站浏览量
redis特点/特性
1. 多样的数据类型
2. 持久化
3. 集群
4. 事务等...
1.1.2NoSQL特点
扩展方便,数据与数据之间没有必然联系,0耦合。
大数据量和高性能(redis => 单秒写10万次 读取11万次) QPS
数据类型的多样化(5+3) String、List、Set、Hash、Zset | geo(地理位置信息) 、hyperloglog(访 客信息)、bitmap 位图(常用计算活跃粉丝和不活跃粉丝、登录和未登录、是否打卡等)
不需要提前设计数据库,随取随用。
1.1.3NoSQL的四大类
KV类型
- 新浪 redis
- 美团 Redis + Tair
- 阿里、百度 redis + memcached
档类型数据库(BSON 和 JSON一样)- MongoDB (目前企业需求也是比较大的) 是一个给予分布式存储的数据库,主要用于处理大量的文档, 是一个介于关系型和非关系型数据库的中间产品,本身属于非关系型。
列存储的数据库
- 大数据的HBase
- 分布式文件系统(一个业务分拆多个子业务,部署在不同的服务器上)
图形关系数据库
- 图示 - 存储的是图形关系,类似与朋友圈或社交平台
- Neo4J InfoGrid
1.1.4关于redis线程问题
redis的单线程的,那么单线程为什么还这么快?
Redis 的数据结构并不全是简单的 Key-Value,还有 list,hash 等复杂的结构。这些结构有可能会进行很细 粒度的操作,比如在很长的列表后面添加一个元素,在 hash 当中添加或者删除一个对象。这些操作可能就 需要加非常多的锁,导致的结果是同步开销大大增加。
总之,在单线程的情况下,代码更清晰,处理逻辑更简单,不用去考虑各种锁的问题,不存在加锁释放锁操 作,没有因为可能出现死锁而导致的性能消耗,不存在多进程或者多线程导致的切换而消耗 CPU。
单线程多进程的集群方案
单线程的威力实际上非常强大,每核效率也非常高。多线程自然是可以比单线程有更高的性能上限,但是在 今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化 的方案,这些方案中多线程的技术照样是用不上的。所以单线程、多进程的集群不失为一个时髦的解决方 案。
CPU 消耗
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。 但是如果 CPU 成为 Redis 瓶颈,或者不想让服务器其他 CPU 核闲置,那怎么办?
可以考虑多起几个 Redis 进程,Redis 是 key-value 数据库,不是关系数据库,数据之间没有约束。只要客 户端分清哪些 key 放在哪个 Redis 进程上就可以了。
2.1redis 基础命令
2.1.1数据库切换操作
2.1.2 查看当前数据库
2.1.3清除数据库中的数据
flushdb 删除当前库 -- 前提进入当前数据库中
flushall 删除所有库
2.1.4设置过期时间
2.1.5查看key类型
type key
2.1.6 查看key是否存在
EXISTS key
3.1redis数据类型
redis存在5种基本数据类型和三种特殊类型
3.1.2String类型
例举:分布式锁、Session相关、验证码相关、计数相关(点击量/阅读量/关注)等单一的值。
3.1.3取值赋值
关键词:set get append strlen
3.1.4加减操作
increment 自增1 decrement 自减
incrby 固定增量 自定义
decrby 固定减量 自定义
3.1.5范围操作 range
getrange key index1 index2 获取当前指定范围 如果最大长度 index2 可替为-1
3.1.6替换操作
setrange key offset index 内容 ##offset 偏移量 指定位置开始替换
3.1.7判断是否存在
EXISTS t6 判断值是否存在
#set with expire #如果存在设置消失时间及信息值 -- 订单
setex key time v 既能增加过期时间还能够重新指定新的值,如果当前key不存在创建一个新的key和值并指定过期时间
#set if not expire #如果不存在 默认会创建一个新的,存在不操作 / 及判断存在不存在同时也能根据结 果进行进一步操作 setnx key v
3.1.8批量值操作
more set
mset k1 v1 k2 v2
mget k1 k2
3.1.9关于对象的存储
3.2.1取值赋值操作
getset 先取值,再赋值
3.2.2关于浮点类型的增减操作
3.2.3删除数据
del key ...
4.1.1List列表类型
list列表类型,特点:所有的命令操作都是使用l开始。 和链表/队列比较相似,可以通过首尾进行操作。