redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合),
zset(sorted set:有序集合)
String类型
简介
1. string数据结构是简单的key-value类型,value不仅是string,也可以是数字,是包含许多类型的特殊类型;
2. string类型是二进制安全的,意思是redis的string可以包含任何数据;
String常用命令
赋值:
1. set key_name value--赋值---多次给同一个key赋值将会覆盖;
2. setnx key_name value--key如果不存在则设值,并返回1;如果key存在,则不设值返回0;
---主要用来用来解决分布式锁的方案之一;
3. setex key_name second value --为key赋值,并且设值过期时间;
取值:
4. get key_name --获取指定key的值,若不存在,返回nul;若key存储的不是字符串类型,返回一个错误;
5. getrange key_name start end--用于获取存储在指定key中字符串的子字符串,截取范围由start和end决定(包含start和end在内,下标从0开始)
6. getset key_name value --用于返回key的旧值,并赋予新值,当key不存在时,返回nul;
自增/自减:
1. incr key_name--incr将key中存储的数值增1;如果key不存在,那么key的值会先被初始化为0,然后再执行incr操作,返回自增后的值;
2. incrby key_name 增量值--将key中存储的数值加上指定的增量值;
3. decr key_name/decrby key_name 减量值;
---自增和自减的key对应的必须是数字类型字符串,否则会出错;
4. append key_name value--字符串拼接,为指定的key在末尾增加,如果value不存在,为其赋值
应用场景
- String通常用于保存单个字符串或json字符串数据;
- 因为String是二进制安全的,所以完全可以把一个图片文件的内容作为字符串来存储;
- 计数器(常规key-value缓存应用);
incr等指令本身就具有原子操作的特性,可以用redis的incr decr incrby decrby等指令来实现原子计数操作。
Hash类型
简介
1. hash类型是String类型的field和value的映射表,或者说是一个String集合。
2. hash特别适合用于存储对象,相比较而言,将一个对象类型存储在hash类型中要比存储在String类型中占用更少的内存空间。
3. 对整个对象的存取可以看成具有key和value的map容器,非常适合存储对象的信息。
4. redis中每个hash可以存储2的32次方-1个键值对。
hash常用命令
赋值:
1. hset key field value --为指定的key,设定fild/value
2. hmset key field value [field1 value1 field2 value2..]--同时将多个field-value(域-值)对存储到hash的key中。
取值:
1. hget key field--获取存储在hash中的值,根据field获取value。
2. hmget key field[field1 field2 field3..]--获取key中给定字段的值。
3. hgetall key--返回hash表中所有的字段和值。
4. hkeys key--获取当前key中所有的字段。
5. hlen key--获取当前key中字段的数量。
删除:
1. hdel key field[field1 field2..]--删除当前key中一个或多个字段
2. del key--将当前的key整个删除----不分类型
其他:
1. hsetnx key field value--field如果不存在则设值,并返回1;如果key存在,则不设值返回0;
2. hincrby key field 增量--将key中指定的字段的整数值加上指定的增量值;
3. hincrbyfloat key field 增量--将key中指定的字段的浮点数值加上指定的增量值;
4. hexists key field--查看指定的key中,指定的字段是否存在。
应用场景
常用于存储对象数据
/**
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成
hashmap存放在redis中。
*/
List类型
简介
1. list类型是一个链表结构的集合,其主要功能有push,pop;
2. list类型是一个双向链表的结构,可以在链表的头部或尾部进行增删操作:---类似java中的LinkedList
3. list既可以作为栈,有可以作为队列;
List常用命令
赋值:
1. lpush key value[value1 value2..]--将一个或多个值插入到列表头部;--相当于头插法
2. rpuch key value[value1 value2..]--将一个或多个值插入到列表尾部;--相当于尾插法
3. lpushx key value --将一个值插入到已存在的列表的头部,如果列表不存在,操作无效;
4. rpushx key value --将一个值插入到已存在的列表的尾部,如果列表不存在,操作无效;
取值:
1. llen key--获取列表长度;
2. lindex key index --通过索引下标获取列表中的元素;
3. lrange key start stop --获取列表中指定范围内的元素;
/*区间由start和stop指定
0表示列表中的第一个元素,1表示列表中的第二个元素,以此类推;
如果用负数表示,以-1表示列表中的最后一个元素,-2表示倒数第二个元,以此类推;
分页:
start:页大小*(页数-1)
stop:(页大小*页数)-1
*/
删除:
1. lpop key--移除并获取列表的第一个元素(从左侧删除);
2. rpop key--移除并获取列表的最后一个元素(从右侧删除);
3. blpop key[key1 key2..] timeout--移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止;
--当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
4. brpop key[key1 key2..] timeout--移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止;
--当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾元素。
5. ltrim key start stop--对一个列表进行修剪(trim),让列表只保留指定区间的元素,不在指定区间之内的元素都将被删除;
修改:
1. lset key index value --通过索引设置列表元素的值;
2. linsert key before|after world value--在列表的元素前或后插入元素;
--将值value插入到列表key当中,位于world之前或者之后;
高级(队列):
1. rpoplpush source destination --移除列表中最后一个元素,并将该元素添加到另一个列表的头部并返回;
--rpoplpush a1 a1:循环列表,将尾元素移到头部;
2. brpoplpush source destination timeout--从列表中弹出一个值,将弹出的元素 插入到另外一个列表中并返回它,如果列表没有元素会阻塞列表直到等待超时或者发现可弹出元素为止;
应用场景
1. 对数据量大的集合数据删减
/*
列表数据显示、关注列表、粉丝列表、留言评论等分页、热点新闻(Top5)等
利用lrange可以很方便的实现分页功能
*/
2. 任务队列
/*
list通常用来实现一个消息队列,而且可以确保前后顺序(不必像Mysql那样用ORDER BY来排序)
*/
/*
任务队列(生产者和消费者)
在处理web客户端发送的命令请求时,某些操作的执行时间可能会比我们预期的更长一些,通过将待执行任务的相关信息放入队列里面,
并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能能完成的操作,这种将工作交给任务处理器来执行的做法被称为任务队列(task queue)
*/
rpoplpush source destination
--移除列表的最后一个元素,并将该元素添加到另一个列表并返回
Set类型
简介
1. Redis的Set类型是String类型的无序集合.
2. 集合成员是唯一的,集合中不能出现重复的数据.
3. redis中集合是通过hash表实现的.
4. 集合中最大的数量为2的32次方-1.
set常用命令
赋值:
1. sadd key member[member1 member2..]--向集合添加一个或多个成员
取值
1. scard key--获取集合的成员数
2. smembers key--返回集合中所有的成员
3. sismember key member--判断member元素是否是集合key的成员,存在返回1,不存在返回0(开发中:验证是否存在)
4. srandmember key [count]--返回集合中一个或多个随机数
删除
1. srem key member[member1 member2..]--移除集合中一个或多个成员
2. spop key [count]--移除并返回集合中的一个随机元素 3.2版本开始支持count
3. smove source destination member--将member元素从source集合移动到destination集合
差集:
1. sdiff [key1 key2..]--返回给定所有集合的差集(左侧)
2. sdiffstore destination [key1 key2..]--返回给定的所有集合的差集并存储到destination集合
交集:
1. sinter [key1 key2..]--返回给定集合的所有交集(共有数据)
2. sinterstore destination [key1 key2..]--返回给定的所有集合的交集并存储到destination集合
并集:
1. sunion [key1 key2..]--返回所有集合给定的并集
2. sunionstore destination [key1 key2..]--返回给定的所有集合的并集并存储到destination集合
应用场景
1. 利用集合操作,获取不同兴趣圈子的交集,方便实现共同关注、共同喜好等功能
2. 利用唯一性,统计访问网站的所有独立IP,存取当天[某天]的活跃用户列表
Zset类型(有序集合 sorted set)
简介
1. Redis有序集合也是string类型元素的集合,并且不允许成员重复。
2. 每个元素关联一个double类型的分数,redis通过这个分数来为集合中的成员进行从小到大的排序。
3. 有序集合的成员是唯一的,但分数可以重复。
4. 集合是通过hash表实现的,集合中最大成员数量为2的32次方-1
zset常用命令
赋值:
zadd key score member[score1 member1 score2 member2..]--向有序集合添加一个或多个成员,或者更新已存在的成员的分数
取值:
1. zcard key--返回有序集合的成员数
2. zcount key min max--返回有序集合中指定分数区间的成员数
3. zrank key member--返回有序集合中指定成员的索引
4. zrange key start stop [withscores]--返回有序集合指定区间内的成员(默认从小到大排序),withscores会将分数也返回
5. zrevrange key start stop [withscores]--返回有序集合中指定区间的成员(分数从高到低)
6. zrangebyscore key min max [withscores] [limit offset count]--通过分数返回有序集合指定区间的成员 limit参数指定返回结果的偏移量及数量;
--当offset很大时,定位offset的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N)
8. zrevrangebyscore key max min [withscores]--返回有序集合中指定分数区间内的成员,分数从高到低排序
删除:
1. del key--移除有序集合
2. zrem key member[member1 member2..]--移除有序集合中的一个或多个成员
3. zremrangebyrank key start stop--返回有序集合中指定的排名区间的所有成员(第一个是0)(低到高排序)
4. zremrangebyscore key min max--移除有序集合中指定的分数区间的所有成员
增值:
zincrby key increment member--增加member元素的分数increment,返回值是更改后的分数
应用场景
排行榜:积分、成绩、销量等等