Redis
待办事项
- redis和memcache的区别(微信有篇公众号非常详细深刻)(Done)
- Redis sentinel(Done)
- 数据结构和原理(Done)
- 注册中心(Done)
- 缓存服务器整合Spring和分布式Session
- 常见面试题(Done)
- 单机配置、集群Cluster和灾备的配置(Done)
- 分布式锁(Done)
- LRU失效策略(Done)
参考资料
redis 5种数据结构和相关命令
https://www.cnblogs.com/Cwj-XFH/p/6938799.html
好的博客,待刷一下
https://blog.csdn.net/zhiguozhu/article/details/50517527
要看完 redis和memcached的区别
http://blog.jobbole.com/101496/
redis的数据结构超级详细
https://www.cnblogs.com/qwangxiao/p/8921171.html
Redis特点
- redis是单线程IO复用(读写排序等操作公用唯一的线程),事件驱动(文件事件和时间事件)
- 速度快,利用内存保存数据,用作缓存服务器,但是支持数据持久化,重启会加载持久化的数据
- 支持丰富数据类型,支持string,list,set,sorted set,hash
- 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
- 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
- 除了存储还支持排序等聚合操作
- 支持集群和高可用,cluster集群的话,支持在线扩容。Sentinel的话,支持Mster和Slave的监控和身份切换
Redis的应用
- 分布式环境的计数器(或者是浏览量统计工具,利用incr函数的原子性来实现)
- 注册中心,在Dubbo中可以用
- 分布式锁,秒杀架构中,定时循环通过SETNX命令获取锁,异步处理秒杀和其它业务订单处理,再引入expire来提升容错性,再结合MQ来分散开订单
- 消息队列
面试题
- Redis原理和 Memcache的区别(Done)
- redis的集群和持久化(Done)
- Redis的请求竞争(Done)
- Redis的实现消息队列(Done)
Redis介绍
开源,Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
支持多种数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
功能强大,Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
Redis实际运用
Redis instal
centos 安装和启动
https://www.cnblogs.com/renzhicai/p/7773080.html
- 安装完之后,修改配置文件,修改daemonize设置为yes,
守护进程模式启动 redis - 设置requirepass huangzs
然后启动之后,客户端连接之后, auth huangzs 就可以了
https://www.cnblogs.com/756623607-zhang/p/6859540.html
redis-server redis.conf
spring配置密码
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="127.0.0.1"/><property name="port" value="6379"/><property name="password" value="huangzs" /><property name="database" value="0"/><property name="poolConfig" ref="poolConfig"/></bean>
然后 redis-cli 直接客户端接入了
Redis 启动和连接
详细API http://doc.redisfans.com/
- 启动
默认模式启动
./redis-server
按照config 设置模式启动(例如设置默认端口和连接密码)
redis-server.exe redis.windows.conf
可以在redis.windows.conf 设置连接密码
requirepass 123456
- 客户端连接redis服务器 密码
redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456
Redis 常见命令
- keys * #查看所有的键
- flushall 清空所有缓存
存取字符串
set name ‘huangzhenshi’ #设置键值对setex key timeoutSecond newValue (setex city 5 newCity) 设置city的值为newCity并且设置过期时间为5s
setnx key value(悲观锁的实现原理,如果不存在这个key就setnx成功,并返回1,否则就返回0)
get name
getset key value (原子操作,相当于replace操作)
存取list
lpush 命令往集合里面放东西
lpush emp huangzs1
lpush emp huangzs2
lpush emp huangzs3lrange 从里面获取,从第一个开始取,取到下标的最后一个
lrange emp 0 -1删除key
DEL nameexists 查看是否存在,是返回1 无返回0
exists nameHSET website google ‘www.google.com’
- HGET website google
按照hashmap的结构,在 website命名的 hashmap的key值为google, value为 ‘www.google.com’
Redis 请求竞争
多个客户端同时对某个key的value进行操作,比如秒杀商品。
- 乐观锁策略(在竞争不激烈的时候,性能好)
- watch方法,带事务的修改数据,类似于volaile,如果price发生改动,则事务失效watch priceget price $price$price = $price + 10multiset price $priceexec
- 悲观锁+expire的实现策略
redis事件驱动
- 文件事件(file event):Redis服务器通过套接字于客户端(或其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。
- 时间事件(time event):Redis服务器的一些操作需要在给定的事件点执行,而时间事件就是服务器对这类定时操作的抽象。(比如定时扫描过期的key、rehash全局的dict、关闭超时客户端)
事件触发回调函数来实现功能,没有文件事件的时候,线程会进入阻塞的状态从而节省CPU的开销,但是有时间事件的时候又开始响应时间事件