redis的数据类型与应用场景(二)
1. 如何学习
redis有好多数据类型,有这么多数据类型,我们不可能每个都记得完完全全。但是我们必须知道它有哪些数据类型,每个数据类型是怎样的,有什么作用。redis的每一个数据类型都有一大堆命令,这些命令也不需要记,要用的时候来查就好了。Redis 命令参考这个网站就可以来查找每个命令的意义和用法。
2. 数据类型的介绍
在memcached中,存的是健值对,也就是说健(key)和值(value)都是string(字符串)类型。而redis的value是可以有很多种类型,比如字符串(string),列表(list),集合(set)等。
redis的key就是字符串类型。key有一些规则如下:
- 不能太长,也不能太短。太长浪费空间,太短不容易区分;
- 尝试用冒号来分隔。例如"user:14"代表数据库中id为14的user的那条记录,这样能跟数据库的对应起来;
- 最大能存512MB;
下面来介绍每种数据类型。
2.1 Redis Strings(字符串)
这种也是memcached唯一有的。这个很简单理解,值跟健一样,都是字符串。
我们下面会用redis-cli这个客户端工具来演示每一种操作。
127.0.0.1:6379> set mykey somevalue
OK
127.0.0.1:6379> get mykey
"somevalue"
127.0.0.1:6379>
很简单,set是设置键mykey的值为somevalue,get是返回键mykey的值。
假如我要对已存在的mykey做set操作,会发生什么呢。
127.0.0.1:6379> set mykey another
OK
127.0.0.1:6379> get mykey
"another"
这样会替换掉之前,如果不想让他替换掉呢,有值就返回之前,而不做任何操作。
这种需求,redis也是提供了命令的,也就不需要自己在程序里做判断。
127.0.0.1:6379> get mykey
"anothor"
127.0.0.1:6379> set mykey newvalue nx
(nil)
127.0.0.1:6379> get mykey
"anothor"
这里想说的是一般的需求redis都是有提供命令的,只要在Redis 命令参考查找,一般都能找到的。
上面说的存字符串,很常用,最简单的就可以用于存储html片段(HTML fragments),后绪会介绍结合rails轻易实现这种功能。
redis还可以用于存储整型类的字符串。比如:
127.0.0.1:6379> set counter 100
OK
127.0.0.1:6379> incr counter
(integer) 101
127.0.0.1:6379> incr counter
(integer) 102
127.0.0.1:6379> incrby counter 50
(integer) 152
这种可用于计数器,比如统计在线人数,文章收藏数等。
着重提一下incr这个指令。它是一个原子(atomic)操作。原子性是ACUD的一种,ACUD即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。原子的意思就是最小的,不可分割。打个比方,在同一个时间,两个客户端访问counter的值,不可能一个得到100,一个得到101。
其他关于string的命令可自行查找。
2.2 Redis Lists(列表)
列表相当于数组,只不过这是redis实现的高性能的列表,你往一个很多的列表插入一个元素也是耗费很少的时间。
往列表的头部插值,用LPUSH命令,往尾部插值,用RPUSH,返回列表的值用LRANGER命令。比如:
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
假如只往头部插入或取出数据,就能形成一个堆栈。往头部取出数据,往尾部插入数据,就形成了一个队列。所以使用list可以构建队列系统。
2.3 Redis Hashes(哈希)
hash就是健值对,跟编程语言所说的哈希是一样的。也就是说,值可以存为结构自由的散列表。
> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"
这种hash可以用于对关系型数据库的映射,比如上面的例子,mysql中的users表有一条id为1000的记录,那就可以存到redis中的hash里。
2.4 Redis Sets(集合)
集合里面存储的内容是字符串(string),所有的字符串是唯一的,且是没有顺序的。所以就没有头和尾的区别了。集合可以用于存储唯一性的列表,比如文章被收藏的用户的ID列表、网站线上的用户的ID等。
集合之间可以取交集,取并集。两个集合取共同的部分,就是取交集,而取并集就是合起来,去掉重复的。
> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
这种可以用于社交领域,比如两个用户取相同的好友,那就是他们各自好友的集合的交集。在微博应用中,经常要计算你和你的朋友共同关注了哪些人,如果用传统的关系型数据库来做,可能一般的做法是用joins语句,假如表很大,这个可能很费性能,但是用redis,就可以事先把他们各自关注的人的id存到set里,再用这两个set取交集,就能取到共同关注的人的id列表。
2.5 Redis Sorted sets(排序集合)
排序集合跟集合(set)和哈希(hash)都有点像。对于集合来说,它不同的是,每个元素是有顺序的,是按照一定规则排过序。这个规则就是以健的形式存储,有点像hash。比如下面的例子,黑客按照出生的年来排序。
> zadd hackers 1940 "Alan Kay"
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer 1)
> zadd hackers 1953 "Richard Stallman"
(integer) 1
> zadd hackers 1949 "Anita Borg"
(integer) 1
> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
> zadd hackers 1914 "Hedy Lamarr"
(integer) 1
> zadd hackers 1916 "Claude Shannon"
(integer) 1
> zadd hackers 1969 "Linus Torvalds"
(integer) 1
> zadd hackers 1912 "Alan Turing"
(integer) 1
获取排序集合的内容。
> zrange hackers 0 -1
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"
6) "Richard Stallman"
7) "Sophie Wilson"
8) "Yukihiro Matsumoto"
9) "Linus Torvalds"
排序集合可用于排行榜应用,因为排行版的内容肯定是唯一的,且有顺序,可以先按照条件排好顺序,比如文章可按阅读量来排。还能用于自动完成,当你在一个搜索框输入时,会提示有哪些可以选择的,提示的那些数据就可以事先存到redis中,先排好顺序且是唯一的。
2.6 Bitmaps
Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type
官方的定义是这样的。我们通过例子来解释它,比如进行网站活跃用户统计工作。
用户可能是存在于users表中,每个用户都有一个id。
假如有很两个用户,id分别为10和11,现在这两个用户,id为10的用户是活跃用户,id为11的是不活跃用户。
127.0.0.1:6379> setbit user 10 1
(integer) 0
127.0.0.1:6379> setbit user 11 0
(integer) 0
127.0.0.1:6379> getbit user 10
(integer) 1
127.0.0.1:6379> getbit user 11
(integer) 0
setbit指令中最后传的1或0就相当于true或者false。这样算存好了。那我要取所有的活跃用户,可以这样。
127.0.0.1:6379> bitcount user
(integer) 1
127.0.0.1:6379> setbit user 100 1
(integer) 0
127.0.0.1:6379> bitcount user
(integer) 2
后绪的文章会对各种场景进行详解。
完结。
redis的数据类型与应用场景(二)的更多相关文章
- Redis各种数据类型的使用场景
Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...
- 一文搞定Redis五大数据类型及应用场景
本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...
- Redis各种数据类型的应用场景
redis是一种key values形式的非关系型数据库,通过内存存储,也可以把数据持久化到本地文件中. redis支持丰富的数据类型,String,list,set,zset,hash,下面说一下各 ...
- Redis的数据类型及使用场景
1.redis 的数据类型 String 字符串 Hash 哈希 List 列表 Set 集合 ZSet(Sorted Set) 有序集合 2.使用场景 2.1 String 用户token 可以用r ...
- Redis各个数据类型的使用场景
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). Redis列表命令 参考:http://www.r ...
- Redis系列之----Redis的数据类型及使用场景
Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求. Redis中所有的数据都存储在内存中,因此读写速度非常快,相 ...
- Redis常用数据类型及使用场景
Redis最为常用的数据类型 字符串(String) 字符串列表(list) 字符串集合(set) 哈希(hash) 有序的字符串集合(sorted set) String(字符串) 字符串是最基本的 ...
- Redis的数据类型以及应用场景
1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...
- Redis多种数据类型以及使用场景
SDS简单动态字符串 struct sdshdr { // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int fr ...
随机推荐
- 折腾WordPress感想
以前在cnblogs上写博客没感觉什么,一旦要搭建自己的博客,我感觉好麻烦啊,具体就体现在一下方面: 1. 域名得要申请 2. 还要购买虚拟机 3. 自己搭建php,mysql,wordpress,a ...
- php调用C代码的方法详解和zend_parse_parameters函数详解
php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方 ...
- quick-cocos2d-x的热更新机制实现
quick-cocos2d-x的热更新机制实现 0 依赖 这里说的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新api,根据更新api的反馈,下载更新资源,然后使用新的资源启动客户 ...
- linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)
1707 许多初学者都有比较大的疑惑,电脑是怎么识别我们写的代码并进行处理的呢?其实这个问题对我们初学者来说是很重要的,只有了解机器的运行原理,我们才能真正地学号留下.那么今天我就以此为题为大家略讲一 ...
- 蓝桥杯 C/C++参考题目 开平方(数学题,迭代法求开方)
开平方 如果没有计算器,我们如何求2的平方根?可以先猜测一个数,比如1.5,然后用2除以这个数字.如果我们猜对了,则除法的结果必然与我们猜测的数字相同.我们猜测的越准确,除法的结果与猜测的数字就越接近 ...
- Oracle性能监控脚本(sql)
1. 监控事例的等待 select event,sum(decode(wait_Time,0,0,1)) "Prev", sum(decode(wait_Time,0,1,0)) ...
- Linux shell(. /path/filename)
在 /etc/profile 文件中,有一段脚本: if [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi 这里的 “点号 + 空格 + 文件” ...
- caffe 网络参数设置
weight_decay防止过拟合的参数,使用方式: 样本越多,该值越小 模型参数越多,该值越大 一般建议值: weight_decay: 0.0005 lr_mult, decay_mult 关于偏 ...
- 52、图片缩放库 PhotoView
PhotoView的简介: 这是一个图片查看库,实现图片浏览功能,支持pinch(捏合)手势或者点击放大缩小.支持在ViewPager中翻页浏览图片. PhotoView 是一款扩展自Android ...
- android实现解析webservices
package com.example.ksoap2demo; import java.io.UnsupportedEncodingException; import org.ksoap2.SoapE ...