新手村的第一篇文章(Redis基础)是村民的处女做,在以后的学习中回看这篇文章,以为有一些纰漏之处,甚是惭愧,这也是本篇文章的由来和内容。从此本村民会努力作得更好些,还请你们多多支持多选参数。web
虽然Redis单个key最多能够存入512M大小,但这并不意味这咱们就能够乱存。咱们编写程序代码时,对变量的命名每每有所要求,对于Redis中key的命名有如下三条建议:redis
Redis基础篇中直接收录了Redis的五种数据类型及其经常使用的一些命令,而对于Redis中对key的一些经常使用基本命令却没有介绍,在此补上,这些命令对全部数据类型的key都适用。数据库
> del mykey1 # 键mykey1未设置
(integer) 0 > set mykey1 "redis" # 设置键mykey1 OK > del mykey1 # 删除键mykey1 (integer) 1 复制代码
> exists mykey1 # 键mykey1已经用del命令删除
(integer) 0 > set mykey1 "redis" # 从新设置mykey1 OK > exists mykey1 # 在此检查键mykey1是否存在 (integer) 1 复制代码
> expire time1 2 # 为不存在的键time1设置过时时间
(integer) 0 > set time1 "2s" # 设置键time1 OK > expire time1 2 (integer) 1 复制代码
> set time2 "2020年3月10日20时过时"
OK >expireat time2 1583841600 (integer) 1 复制代码
> set time3 "3000ms"
OK > pexire time3 3000 (integer) 1 复制代码
> set time4 "2020年3月10日21时过时"
OK > pexireat time4 1583845200000 (integer) 1 复制代码
expire、expireat、pexpire和pexpireat命令都是设置成功时返回1,当key不存在或没法设置时返回0。 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至如今的总毫秒数。在实际应用中时间戳有秒级和毫秒级,通常咱们经常使用秒级。
> ttl time5 # time5不存在
(integer) -2 > set time5 "5s" #设置time5但不设置过时时间 OK > ttl time5 (integer) -1 # time5永久保持有效 >expire time5 5 # 设置5秒后过时 (integer) 1 > ttl time5 (integer) 2 > ttl time5 (integer) -2 复制代码
> ttl time6 # time6不存在
(integer) -2 > set time5 "6s" #设置time6但不设置过时时间 OK > ttl time6 (integer) -1 # time6永久保持有效 >expire time6 6 # 设置6秒后过时 (integer) 1 > ttl time6 (integer) 2 > ttl time6 (integer) -2 复制代码
> persist time7
(integer) 0 > set time7 "7s" OK > expire time7 7 (integer) 1 > ttl time7 (integer) 4 > persist time7 (integer) 1 > ttl time7 (integer) -1 # ttl命令返回值-1表示time7永久有效 复制代码
>mset NPC1 "NO.1" NPC2 "NO.2" NPC3 "NO.3" NPC4 "NO.4"
OK > keys NPC* 1) "NPC3" 2) "NPC4" 3) "NPC1" 4) "NPC2" 复制代码
> randomkey
"NPC2" > randomkey "NPC4" 复制代码
>renamenx NPC1 NPC2
(integer) 0 >renamenx NPC1 NPC (integer) 1 复制代码
> type NPC
string > type NPC5 none 复制代码
Hash类型经常使用于存储一个对象,好比存储用户的我的信息,存储用户的购物车信息等等。缓存
当咱们用String类型的key-value结构存储一个对象,好比说存储用户的id、姓名、年龄、住址等信息时,主要有2种存储结构:安全
# 第一种
key:id value:序列化的其余信息 复制代码
第一种方式将用户ID做为key,其余信息封装成一个对象并序列化做为value的方式存储。这种方式有几点缺陷:服务器
# 第二种
key:user:1:name value:姓名值 key:user:1:age value:年龄值 key:user:1:address value:地址值 key:user:2:name value:姓名值 ······ 复制代码
第二种方式将对应用户id:属性名做为key,属性值做为value的方式进行存储。这种方式虽然解决了第一种方式中序列化/反序列化的问题和并发问题,可是以这种方式存储,用户id信息会重复存储,且一个用户的信息就使用了好几个key-value对,当用户数量较大时,占用大量内存空间,形成内存浪费。 Hash是最接近关系数据库结构的数据类型,能够将数据库的一条记录或程序中的一个对象转换成HashMap存放在Redis中。使用Hash类型存储一个对象不只节省空间,对信息进行操做也有相应的命令,比较安全。数据结构
List类型很适合实现多种数据结构,好比栈、队列等等。使用rpush和rpop命令可实现栈,使用rpush和lpop可实现队列。并发
Set类型经常使用于对两个集合之间的数据求交集、并集、差集。好比说咱们能够求出两个用户的共同好友、共同喜欢的歌曲,求当日首次登录的新用户等等。dom
因为Zset类型相对于Set类型多存储了分数以进行排序,所以Zset类型经常使用于各类排行榜。好比说班级中考试成绩的排行,热搜榜的排行等等。除此以外,咱们还能够利用分数作权重,造成可变优先级的队列,将重要的操做权重增长,这样就能够保证先执行这些操做。编辑器
Redis把数据存在内存中以保证较高的存取性能,然而相比于磁盘空间大小,内存的容量是至关有限的。若是Redis一直存入,不对数据进行淘汰,必然会占用大量内存空间,最终将致使内存溢出并影响CPU的执行效率,形成服务器宕机等严重后果。所以,Redis做为优秀的中间缓存件,即便采起了集群部署来动态扩容,也应该即时整理内存,维持较高的系统性能。在Redis中有两种解决方案: 一为数据设置超时时间:Redis中提供了几个设置数据过时时间的命令
expire key seconds # 以秒为单位,是最经常使用的方式
setex key seconds value # 在设置key-value对的同时设置过时时间,string类型专用 复制代码
只有string类型有专用命令,其余数据类型都要依靠key基本命令expire等设置过时时间 若是没有设置过时时间,那么key永久保持有效 若是设置了过时时间以后想让key再次永久保持有效,使用persist key命令
二为使用Redis提供的淘汰策略:在生产环境中,咱们使用配置参数maxmemory来限制内存的大小,使用配置参数maxmemory-policy来选择淘汰策略。在默认状况下,maxmemory为0,表示内存使用不受限制,而maxmemorey-policy为noeviction。
上述是Redis的6种淘汰策略,可是咱们该如何选择哪种策略来提升性能呢?答案是因地制宜,咱们必须根据自身系统特征来选择合适的策略。
本文使用 mdnice 排版