设为首页 收藏本站
查看: 734|回复: 0

[经验分享] Redis入门教程

[复制链接]

尚未签到

发表于 2016-12-18 08:12:22 | 显示全部楼层 |阅读模式
安装Redis之后大家肯定都试过get set 命令了,也了解了最基本的数据类型字符串,下面让我们认识以下Redis 中的其他成员吧。
 

  • 二进制安全(Binary-safe)的字符串(String
  • 二进制安全的字符串列表(List
  • 二进制安全的字符串集合(Set
  • 有序的集合(SortedSet
 
1RedisKeys
  这里的key指的是Redis 键值对的key。
  Redis Key 是二进制安全的,也就是说你可以用任意二进制序列作为key,从一个简单的字符串到一个jpg图片内容。空字符串也是有效的key值。
  
key个几个规则:

  •   不要太长。这个大家都明白,越长越消耗内存,查找时的计算代价也越高。
  •   不要太短。太短的key不容已阅读和理解,比如user:100:password 写成u:1000:p,会让人不明所以。因为key相对与value总是很小的,所以由此带来的一点点的空间节省并无太大优势。
  •   遵循一种模式。比如“对象类型:id:字段名”,就行上面提到的user:100:password,如果有多个单词,可以用一个点来代替空格:comment:1234:reply.to
2字符串
  这个是Redis 最简单的数据类型,如果还没有安装Redis,那么到下面网页感受一下把:
  http://redis.io/commands/get
  
  ps: 本文的例子都是在线录入的。直接在Example 下面的文本框里输入命令,回车。
redis>set alan
OK
redis>get
"alan"
redis>set 暗号"还记得大名湖畔的 唉冬瓜吗 "
OK
redis>get 暗号
"还记得大名湖畔的 唉冬瓜吗 "
redis>
  这里我直接用中文作为key,没有一点问题。
  前面提到key 可以是任意二进制字符串,那么值也同样,你可以保存一副图片(值大小不能超过512M)。
  虽然字符串是基本类型,也可以进行一些有趣的操作:
redis>set qty 256
OK
redis>get qty
"256"
redis>incr qty
(integer)257
redis>get qty
"257"
redis>incrby qty 100
(integer)357
redis>get qty
"357"
redis>
  incr 命令把字符串解析成整型,然后+1,再保存为字符串。类似的命令还有incrby, decr, decrby。
  如果字符串值不能解析成整数,incr命令会报错,如ERR value is not an integer or out of range
redis>set name alan
OK
redis>incr name
ERR valueis not an integer or out of range
redis>
  incr 叫做atomic increment,其atomic (原子)特性的意义:如果两个客户端同时发送incr 命令,客户端会同时读到“10”,对它们+1,最终的结果一定为12,要更多了解可以去官网查看相关资料。
3列表(list)
  首先讲一下list的理论背景,list这个词很多时候都被不恰当的使用,比如python 的list,她们实际上是数组。一般意义上讲,list就是有序元素的集合。而使用数组 实现,和使用 linked list实现的list在属性上有所不同。
  Redis 的list 是使用Linked List 实现的,其优点是在list的两端添加元素其时间复杂度是常数级的。也就是说你在‘10个元素的list头部添加新元素,和在一亿个元素的list头部添加消耗的时间相同;而使用数组实现list的优势在于索引速度非常快。
  Redis使用Linked List实现的原因是:对于一个数据库系统来说,能快速在很大的列表上添加元素至关重要。
3.1第一步
  添加新元素的命令是lpush 和rpush,分别在左边(头部)和右边(尾部)添加一个元素。lrange接受三个参数,列表的key,范围的开始,范围的结束,返回一个列表的片段。
redis>lpush message "你好,很高兴认识你"
(integer)1
redis>lpush message "我也很高兴认识你,我是alan"
(integer)2
redis>lpush message "我的名字是bruce "
(integer)3
redis>lrange message 0 2
1) "我的名字是bruce "
2)"我也很高兴认识你,我是alan"
3)"你好,很高兴认识你"
redis>
  由上面例子里,我们每次都在列表头部添加一个元素。
  lrange也可已接受负数来表示范围,-1 是最后一个元素,-2是倒数第二个元素。
redis>lrange message -1 -1
1)"你好,很高兴认识你"
redis>lrange message -1 2
1)"你好,很高兴认识你"
redis>lrange message -2 2
1)"我也很高兴认识你,我是alan"
2)"你好,很高兴认识你"
redis>
  由上例,list可以应用到聊天系统;可以用在评级系统里,比如reddit.com;用在博客引擎中,每篇日志都是一个list,然后向里面放入评论;等等。
3.2在List中放入ID,而不是数据
  上例中,我们直接将数据对象(消息的内容)放入了list,由于对象可能多次被引用,通常我们不那样做,而是存放ID到list中。
  上面聊天的例子,我们用新的方式来存储:
redis>incr next.message.id
(integer)1
redis>set message:1:sender alan
OK
redis>set message:1:content "hello, something else"
OK
redis>lpush messages 1
(integer)1
redis>incr next.message.id
(integer)2
redis>set message:2:sender bruce
OK
redis>set message:2:content "something else else ..."
OK
redis>lpush messages 2
(integer)2
  这次,我们先通过incr 生成一个唯一的ID,然后创建对象,并为对象赋值,最后把这个对象的id 放入list中。
  在命令参考里可以看到更多关于list的命令,Redis命令参考传送
4集合Set
  Redis的Set 是无序的,元素是二进制安全的字符串。

  •   sadd命令可以向集合中添加一个元素
  •   scard命令获得集合中元素的个数
  •   smembers命令获得集合中所有元素(无序)
  •   srem 移除集合中的一个或者多个元素
redis>sadd myset 1
(integer)1
redis>sadd myset 2
(integer)1
redis>scard myset
(integer)2
redis>sadd myset 3
(integer)1
redis>scard myset
(integer)3
redis>smembers myset
1) "1"
2) "2"
3) "3"
redis>srem myset 1
(integer)1
redis>srem myset 2 3
(integer)2
redis>smembers myset
(empty listor set)
redis>

  •   sismenber 判断元组是否在集合中存在
redis>sadd myset 2
(integer)1
redis>sismember myset 2
(integer)1
redis>sismember myset 22
(integer)0
  如果元素存在返回1,不存在返回0。

  •   sinter 命令可与取两个集合的交集
redis>sadd set1 1
(integer)1
redis>sadd set1 2
(integer)1
redis>sadd set1 3
(integer)1
redis>sadd set2 2
(integer)1
redis>sadd set2 3
(integer)1
redis>sadd set2 4
(integer)1
redis>sinter set1 set2
1) "2"
2) "3"
redis>
5有序集合Sorted Set / ZSet
  关于有序集合的意义不多说,可以用zadd 来创建一个有序集合,用zrange 获取元素:
redis>zadd students 15 tom
(integer)1
redis>zadd students 33 bill
(integer)1
redis>zadd students 18 alis
(integer)1
redis>zadd students 18 alan
(integer)1
redis>zrange students 0 -1
1) "tom"
2) "alan"
3) "alis"
4) "bill"
  ZSet 的每个元素都有一个评分,Redis通过这个评分排序。上面例子中15 33 18 18 都是评分,如果评分相同那么会根据元素进行排序。上面alan 排在了alis 的前面。

  •   通过zrevrange 进行反向排序
redis>zrevrange students 0 -1
1) "bill"
2) "alis"
3) "alan"
4) "tom"

  •   通过zrangebyscore 来获取ZSet 的片段,比如我们要获得评分在18 - 30 之间的元素:
redis>zrangebyscore students 18 30
1) "alan"
2) "alis"
  可以看到评分为 18 的元素都包含进来了。

  •   inf 代表正的极限,-inf 代表负的极限,可以用这个来获取大/小于某个评分的元素
redis>zrangebyscore students -inf 30
1) "tom"
2) "alan"
3) "alis"

  •   通过zremrangebyscore 删除元素
redis>zremrangebyscore students -inf 30
(integer)3
redis>zrange students 0 -1
1) "bill"
redis>
  可以看到评分为-inf 到30 的元素都被删除了(共3个),最后只剩下了一个元素。
  参考:http://redis.io/topics/data-types-intro

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315736-1-1.html 上篇帖子: 批量清除redis内存数据 下篇帖子: Redis细节积累
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表