redis
NoSQL特点
1.方便扩展,数据之间没有关系很好扩展
2.高性能(Redis 一秒写8万次,读取11万,NoSQL的缓存记录集是一种细粒度的缓存,新能比较高)
3.数据类型多样型(不需要事先设计数据库,随取随用)
NoSQL的四大分类
KV键值对:redis
典型应用场景
文档型数据库(bson格式和json 格式): MongoDB
列存储数据库: HBase 分布式文件系统
图关系数据库: InfoGrid,Neo4j
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value)[3] | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。[3] | Key 指向 Value 的键值对,通常用hash table来实现[3] | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据[3] |
列存储数据库[3] | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库[3] | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库[3] | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。[3] |
Redis(Remote Dictionary Server ),即远程字典服务。
Redis 特点
1.持久化(rdb、aof)
2.效率高,可用于高速缓存
3.发布与订阅系统
4.地图信息分析
5.计时器、计数器
Redis 基础
Redis默认有16个数据库
select 1 // 选择1数据库
flushdb //清除当前数据库
flushall //清除所有的数据库
keys * //查看所有的key
exists key //判断当前的key是否存在
move key //移除当前的Key
expire key 10 //设置key的过期时间
ttl key //查看当前key的剩余时间
type key //查看当前key的类型
Redis 是单线程的,将所有的数据全部放在内存中,所以说使用单线程去操作效率是最高的,多线程的话会造成CPU的上下文切换,对于内存来说没有上下文切换效率就是最高的。
Redis 的五大数据类型
1.String(字符串)
set key //设置值
get key //获取值
append key "ddd" //追加字符
getrange key 0 3 //截取字符串[0,3]
setrange key 2 xxx //替换指定位置开始的字符串
setex key 30 "hello" //设置key过期时间
setnx (set if not exist)//不存在在设置
mset k1 v1 k2 v2 //设置多个值
mget k1 k2 //获取多个值
mssetnx k1 v2 k4 v4 //是一个原子操作,要么成功,要么失败
2.List
list 可以当做栈、队列、阻塞队列
lpush list xxx //将一个值插入列表头部
rpush list xxx //将一个值插入列表尾部
lrange list 0 -1 //取出所有的值
lrange list 0 1 //通过区间获取值
lpop list //从左边移除第一个元素
rpop list //从右边移除最后一个元素
lindex list 1 //获取第二个值
llen list //获取列表的长度
lrem list 1 one //移除list指定个数的值
ltrim list 1 2 //通过下标截取指定长度
rpoplpush list(原来的列表) mylist(新列表) //移除最后一个元素并添加到新的列表
exists list //判断列表是否存在
lset list 0 item //根据索引更新数据
linsert list before "xxx" "value"//在xxx前面插入value
linsert list after "xxx" "value"//在xxx后面插入value
3.Set
sadd set "xxxx" //set集合中添加元素
smembers set hello //获取集中所有元素
sismembers set hello //判断一个值是不是在set集合中
scard set //获取set集合中元素的个数
srem set hello //移除set中的元素
spop set //随机移除set 中的元素
smove set(原集合) set1(新集合) hello //移动指定元素到另一个集合中
sdiff key key2 //两个集合的差集
sinter key key2 //交集
sunion key key2 //并集
4.Hash
hset hash filed hello //给hash 里面添加一个具体的值
hget hash filed //获取hash 里面的值
hset hash filed hello filed2 hello2//添加多个值
hgetall hash //获取hash里面的所有值
hdel hash filed //删除指定的key 对应的值
hlen hash //获取hash 的长度
hexists hash filed//判断hash 中的值是否存在
hkeys hash //获取所有的Key
hcals hash //获取所有的值
5.Zset(有序集合)
zadd set 1 one //添加一个值
zadd set 1 one 2 two //添加多个值
zrange set 0 -1 //获取所有的值
zrangbyscore salary -inf +inf //排序从最小值到最大值排序
zrangbyscore salary -inf +inf withscores//排序从最小值到最大值排序 带成绩的
zrem salary xiaoming //移除指定元素
zcard salary //获取集合个数
Redis事务的概念:
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
Redis事务没有隔离级别的概念:
批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。
Redis不保证原子性:
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
Redis事务的三个阶段:
- 开始事务
- 命令入队
- 执行事务
Redis事务相关命令:
watch key1 key2 … : 监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 ( 类似乐观锁 )
multi : 标记一个事务块的开始( queued )
exec : 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )
discard : 取消事务,放弃事务块中的所有命令
unwatch : 取消watch对所有key的监控
Redis主从复制
主从复制数据复制是单向的只能由主节点到从节点。
主从复制的作用:
-
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
-
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
-
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
-
读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
-
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
redis 集群搭建 方法一(使用命令是暂时的) info replication //产看当前redis的信息 修改 redis.conf、port(端口)、 pid(后台进程文件)、 logfile(日志)、dump.rdb 默认情况redis都是主节点,一般情况只配置丛机就可以了 slaveof ip 端口 //配置从节点 方法二(修改配置文件是永久的) redis.config replicaof ip(主节点ip) port(主节点端口) masterauth 密码 //主机有密码则添加密码
主从复制复制原理
1.增量复制:主节点继续将新收集到的修改命令,将其存盘并加载到内存中
2.全量复制:从节点接收到主节点的整个数据文件,完成一次同步
宕机后手动配置主机
slaveof no one // 如果主机断开了连接,让自己变为主节点,如果主机恢复需要重新配置
哨兵模式(Sentinel)
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
哨兵的作用
1.通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
2.当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
sentinel.conf
port 26379 //端口
dir /tmp //工作目录
sentinel moitor myredis(主机名称) ip 端口 1(主机宕机,丛机投票)//配置哨兵
redis-sentinel sentinel.conf //启动哨兵
//如果主机恢复,只能归并到新主机下,成为丛机。