当前位置:首页 > 问答 > 正文

千峰学Redis的那些零碎笔记,边学边写记录点滴心得分享

(笔记开始)

今天开始跟着千峰的课学Redis了,老师一上来没说Redis是啥,先讲了个事儿,说以前网站都是直接查数据库的,人一多,数据库就撑不住,慢得要死,然后就说,得找个“中间人”帮数据库分担压力,这个“中间人”就是Redis,这么一说我就懂了,它就是个临时仓库,把常用的东西放里边,用的时候直接拿,不用老跑远路去数据库取了。

Redis把所有数据都放在内存里,所以快得飞起,但这里我有个疑问,内存一断电数据不就没了吗?老师后边果然讲了,说Redis有办法,可以定期把数据存到硬盘上,就算重启了也能从硬盘再加载回来,这叫持久化,哦,这样我就放心了,不然总感觉不踏实。

学安装的时候,在Linux上折腾了一会儿,不过按照步骤来也挺顺利,启动服务器用redis-server,像个后台老大爷开始待命,然后要操作它,得用另一个窗口开个客户端redis-cli,就像跟老大爷对话的窗口,这个比喻好玩儿。

接下来是重头戏,学数据类型,一开始我以为Redis就是个存字符串的key-value仓库,没想到花样这么多。

字符串(String):最基础的,不仅能存普通的“hello world”,还能存数字,而且对数字还能直接操作,比如有个key叫“article:100:views”代表文章100的浏览量,可以直接用INCR命令让它加1,不用我先读出来,加完再写回去,这个太方便了,要是用数据库SQL语句得写好几句,这里一条命令搞定,原子性的,不怕多人同时操作出错。

哈希(Hash):这个我理解了半天,老师用“用户信息”举例子,如果一个用户有id、name、age三个字段,我可以用三个String来存,但更优雅的方式是用一个Hash,key是“user:1”,里面field-value对是“name”->“张三”,“age”->“20”,这样相关信息就归拢到一起了,管理起来方便,取的时候也能一次性拿回整个对象,感觉就像把一件东西的各个零件放到了一个盒子里。

列表(List):一听到列表我就想到Python里的列表,可以两头操作,Redis的List也是,左边进右边出就是队列(FIFO),左边进左边出就是栈(LIFO),老师演示了用LPUSHRPOP实现个简单的消息队列,虽然实际项目可能用更专业的消息中间件,但这个原理让我明白了队列是咋回事,还有个妙用是LRANGE命令,可以取列表里一个范围的值,做个简单的文章列表分页好像也可以。

集合(Set):特点就是不能重复,而且支持交集、并集这些数学操作,老师举的例子是微博的共同关注,我关注的人存一个set,你关注的人存一个set,咱俩的共同关注就是两个set的交集,一条SINTER命令就出来了,这个确实比在数据库里用JOIN查表要简单高效得多。

有序集合(ZSet):这是我觉得最牛逼的数据结构,它给每个元素都加了个分数(score),可以根据分数排序,排行榜简直就是为它量身定做的!比如做个游戏积分榜,key是“leaderboard”,成员是玩家ID,分数就是他的积分,用ZREVRANGE命令直接从大到小把前十名取出来,太顺滑了,还能查某个玩家的排名,简直完美。

学完这几个类型,我感觉Redis不是个简单的缓存,它用不同的数据结构解决了不同场景下的特定问题,工具选对了,事半功倍。

然后老师讲了Key的常用命令,KEYS *可以看所有key,但生产环境不能用,数据多了会卡死,还有设置过期时间EXPIRE,这个太有用了,比如手机验证码,存进Redis,设置60秒过期,时间一到自动删除,省心。

今天第一天学,信息量挺大,但跟着例子敲一遍命令,感觉还挺实在的,不像有些教程一上来就一堆理论,明天好像要讲持久化和高级点了,期待,最大的心得就是,学技术不能光听,得动手敲,一敲就明白为啥这么设计了。

(笔记继续)

今天学Redis的持久化,为啥要持久化?就是因为数据在内存里,一断电就全没了,所以得想办法存到硬盘上,Redis提供了两种主要方法:RDB和AOF。

RDB(快照):老师打了个比方,说RDB就像给当前的数据拍张照片,可以设置每隔一段时间,比如900秒内至少有1个key变了,就自动拍一张照片存成.rdb文件,这个文件是二进制压缩的,比较小,恢复的时候直接把照片读进内存就行,速度快,但缺点是可能会丢数据,比如我刚拍完照,下一秒数据变了,但还没到下次拍照时间,这时候服务器挂了,那最后一次拍照后的数据就没了。

AOF(日志):这个就好理解了,它不拍照,而是像个记账先生,把每一个写操作命令(比如SET、INCR)都记录到一个日志文件(.aof文件)里,恢复的时候,就把这个日志里的命令从头到尾重新执行一遍,这样数据就重建了,这样丢数据的风险小,因为可以设置每秒钟就把日志同步一次到硬盘,但缺点是日志文件会越来越大,而且恢复起来比RDB慢。

老师说要根据业务场景选,要高性能快恢复就用RDB,要数据更安全就用AOF,很多生产环境是两者都开启,混着用。

后面还简单提了一嘴事务,Redis的事务和数据库的不太一样,它不像MySQL有回滚,Redis的事务就是把一系列命令打包,然后一起执行,中间不会被别的命令插队,能保证隔离性,但不保证原子性(意思是如果一个命令失败了,后面的命令还会继续执行,不会整体回滚),感觉有点怪,但老师说Redis设计就是这样,有它自己的考虑,可能就是为了简单和快吧。

今天还学到了PUB/SUB(发布订阅),就是消息的广播,有人往一个频道(channel)发布消息,所有订阅了这个频道的人都能收到,做个简单的聊天室或者消息通知应该挺好用。

学到现在,感觉Redis真是个多面手,不只是缓存,还能做消息队列、排行榜、计数器、甚至做会话存储(Session Storage)代替Cookie,老师建议我们多想想怎么用这些数据结构解决实际问题,而不是死记命令。

先记到这,得去消化一下了。

(笔记结束)

千峰学Redis的那些零碎笔记,边学边写记录点滴心得分享