Redis

1.redis简介

  Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
  基于内存运行,性能高效
  支持分布式,理论上可以无限扩展(因为数据之间无关系)
  key-value存储系统
  开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
  相比于其他数据库类型,Redis具备的特点是:
  C/S通讯模型
  单进程单线程模型
  丰富的数据类型(不需要预先设计数据库)
  操作具有原子性
  持久化
  高并发读写(官方:一秒写8万次,读11万次)
  支持lua脚本

2.redis学习

入门

redis :Remote Dictionary Server,即远程字典服务,redis不区分大小写

用途

(数据库,缓存,消息中间件MQ)
1.内存存储,持久化(rdb,aof)
2.效率高,可以用于高速缓存
3.发布订阅系统
4.地图信息分析
5.计时器、计数器(浏览量)

特性

1.多样的数据类型
2.持久化
3.集群
4.事务

基础知识

1)redis默认有16个数据库,默认使用第0个

select n 切换数据库
dbsize 查看db大小
keys * 查看当前所有的keys
set name value
get name
flushdb 清空当前数据库
flushall 清空所有库
exists key 判断key值是否存在
move key db 将当前数据库的 key 移动到给定的数据库 db 当中。
expire key seconds 为给定 key设置过期时间。
ttl key 查看key的剩余存活时间time to live
type key 查看当前key的类型
setex (set with expire) 设置过期时间
setnx (set if not exist) 不存在再设置(分布式锁中常常使用),一个失败全部失败
mset,mget 批量值处理,如mset k1 v1 k2 v2

2)redis是单线程,官方表示,Redis基于内存操作,cpu不是redis的瓶颈,redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程实现,就使用了单线程。

3)redis是C语言写的,官方提供的数据力100000+的QPS,这个完全不比使用key-values的Memcache差

4)Redis为什么单线程还那么快?
误区:多线程(cpu上下文会切换,会耗时)一定比单线程快?
核心:redis是将所有数据全部存到内存,所以说使用单线程去操作效率就是最高的,多线程cpu上下文切换耗费时间,对于内存系统来说,如果没有上下文切换效率是最高的。多次读写都是在一个cpu上的。

脉络

1).五大基本类型

a) String
append key value 动态修改字符串:如果当前key不存在,则新增

strlen key 查看key长度

incr key key加1,decn key key减1

incrby key stap 设置key的自增步长,同理自减步长

getrange key start end 截图字符串长度(0到-1查看全部),同理setrange,相当于java中的repalce

getset 先获取再设值

b) List
list相关均是以l开头
lpush list v 存的时候123,取得时候321
lrange list start end
rpush list v 存的时候321,取得时候123
lpop list
rpop list 移除
lindex list index 获取list第index+1个元素
Llen list 获取长度
lrem list 数量 元素 从list中移除“数量”个“元素”
ltrim list start end 截取list,从start开始,到end
linsert list before/after 元素

总结:
实际是一个链表
如果key不存在,创建新的链表
如果key存在,新增
如果移除,则为空,也代表不存在
在两边插入或改动值效率最高,如果链表很长,又去执行中间元素,效率会很低
消息排队,消息队列,Lpush左近Rpop右出做队列,Lpush左进Lpop左出做栈

c) Set
sadd myset v增加元素
smembers myset 查看所有元素
sismember myset v 判断v是都是成员元素(sismember=set is menmber)
scard myset 获取元素个数
srandmember myset 随机选出一个元素
sdiff myset1 myset2 两个set的差集
sinter myset1 myset2 两个set的交集(共同关注)
sunion myset1 myset2 两个set的并集
d) Hash
key map(key,velue)形式
hset myshash k v
hget myhash k
hgetall myhash 获取全部数据
hdel myhash k 删除指定k
hlen myset 获取长度
hexists myhash k 判断k是否存在
hkeys myhash 获取全部k
hvals myhash

e) Zset

2).三种特殊数据类型

a)Geospatial :地图操作相关,如求地图位置,方圆半径
b)hyperloglog:基数统计数学相关,求交集、并集之类的
c)bitmap:存位图,打卡签到之类,统计打卡记录

3).redis配置详解
4).redis持久化

(1)RDB
(2)AOF

5).redis事务操作(非acid)

事物本质:一组命令,一块执行

Redis单挑指令保证原子性,事务不保证原子性,没有隔离性,

补充:acid:
原子性(Atomicity):
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):
事务前后数据的完整性必须保持一致。
隔离性(Isolation):
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability):
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

6).redis实现订阅发布(消息队列也可实现该功能)
7).redis主从复制
8).redis哨兵模式
9).缓存穿透及解决方案

  请求本应该先去redis缓存,rediis缓存相当于mysql数据库的屏障,但当大量的请求同时到达时,可能会直接去请求mesql数据库

10).缓存击穿及解决方案
11).缓存雪崩及解决方案

缓存雪崩,例如服务器宕机

12).基础api之jedis详解

持续更新中。。。

你可能感兴趣的:(闫同学的消息中间件组件学习,redis,缓存,数据库,java)