Skip to content

redis 数据类型讲解 以及 适合场景http://www.360doc.com/content/15/0324/16/5054188_457703414.shtml

1 存储结构

Redis 是以字典的结构存储数据的, 通过键值对的方式进行存储(key=>value) , 在储存类型中有5种 (1)字符串类型, (2)散列类型, (3)列表类型, (4)集合类型, (5)有序集合类型

2 内存存储持久化

Redis 可以在一秒内读写超过10万个键值, 并且Redis 可以为每个键值设置生存时间(生存时间到后键会被自动删除)

3 功能

Memcached 支持多线程, Redis是单线程模式, Redis支持服务器集群, Redis 可以限定数据占用最大的内存空间(如达到空间, 则可按照规则淘汰不需要的键) Redis的列表行键可用来实现队列, 并且支持阻塞式读取 目前多数公司对Redis的应用以缓存和队列为主 Redis 支持事物 , 不支持回滚

4 Redis 配置

Redis

(1)可以通过配置文件来配置/path/to/redis.conf是否开启持久化, 日志级别等.

(2)也可通过配置文件的模板来配置redis.conf

(3)还可通过 CONFIG SET命令进行修改配置

5 多数据库

Redis 是以字典结构的存储服务器, redis默认支持16个数据库 从0开始递增 可以通过SELECT 1 来切换数据库, Redis数据库不支持自定义命名,数据库以编号命名(从0递增) Redis 不支持为每个数据库设置不同的访问密码

6 Redis 支持事物

7 Redis 类型

1, 字符串类型 命令 :

赋值: SET chace_name xzq 取值: GET chace_name (return xzq) 递增数字: INCR chace_name (return 1 , 如当前值为整数,可以会自动递增 再次输入 INCR chace_name return = 2) 增加指定的整数 : INCRBY chace_name 2 (chace_name = 1 return 3 ) 递减数字 : DECR chace_name (chace_name = 2 return = 1 ) 减少指定的整数 : DECRBY chace_name 2 (chace_name = 3 reutrn 1) 增加指定的浮点数 : INCRBYFLOAT chace_name 2.7 增加指定的科学计数法: INCRBYFLOAT chace_name 5E+4 向尾部追加值 : APPEND chace_name " word!" (chace_name = hello return = "hello word!") 获取字符串长度 : STRLEN chace_name (一个中文字符 占三个字节) 同时设置多个键值 : MSET key1 a key2 b key3 3 同时获取多个值 : MGET key1 key2 ( return = {2,3} ) 位操作 : 左移右移 (由于本人对左移 右移 迷糊 请参考相关文档) 总结: 字符串类型如果存储文章类信息 需要 先将文章序列化 之后在进行存储 , 存储比较简单.可以用来存储文章类信息(缺点: 如果我只想取出文章标题 , 那么需要将整个字符串取出 然后进行反序列化 )

2, 散列类型 命令 :

赋值 : HSET chace_name zhangsan 20 赋值 : HSET chace_name lisi 30 取值 : HGET chace_name zhangsan ( return = 20 ) 同时设置多个值 : HMSET chace_name key1 v1 key2 v2 同时获取多个值 : HMGET chace_name key1 key2 ( return = {v1, v2} ) 获取所有键值 : HGETALL chace_name {return = {key1:v1, key2: v2} 返回值为对象 } 判断字段是否存在 : HEXISTS chace_name key1 (存在return = 1 , 不存在 return=0 ) 当字段不存在时赋值 : HSETNX chace_name key3 v3 (如: key3不存在 则赋值 , 如存在则不变) 增加数字 : CHINCRBY chace_name key1 15 (key1 = 10 return 25 返回结果为增长后的结果) 删除一个或多个字段 : HDEL chace_name key1 (return = 1 当键存在删除成功则返回值为1 当键不存在则返回值为0) 只获取字段名 : HKEYS chace_name ( return = {key1, key2} ) 只获取字段值 : HVALS chace_name ( return = {v1, v2 } )

总结 : 我个人认为 可以将散列类型当做一维数组 进行操作

$chace_name = array(
    title => '文章1',
    time => '20161117',
    content => '内容.....',
);

3, 列表类型 命令 :

向列表左侧增加元素 : LPUSH chace_name v1 向列表右侧增加元素 : RPUSH chace_name v1 列表左边弹出一个元素 : LPOP chace_name 列表左边弹出一个元素 : RPOP chace_name 获取列表中元素的个数 : LLEN chace_name ( 类似于 select count(*) from table_name ) 获得列表片段 : LRANGE chace_name 0 100 (return {v1, v2})(如果 参数100 大于实际范围 那么将会获取都最右边的元素) 删除列表中指定的值 : LREM chace_name -1 2 (删除从右边开始第一个值为2的元素) 获取列表指定索引的值 : LINDEX chace_name 0 (第0个索引值 , -1 最后一个索引值) 索引赋值 : LSET chace_name 1 lisi (为索引为1的 赋值为 lisi) 删除指定索引范围之外的元素 : LTRIM chace_name 0 2 (与 LRANGE 命令相似) LITRIM 此命令通常与LPUSH 联合使用 : 应用场景: 如 我只想保留最新的100条记录 LPUSH chace_name $log1 , LTRIM chace_name 0 99 向列表中差入元素 : LINSERT chace_name AFTER 2 zhangsan (会根据 第二个参数决定 是差入到 该元素的前边或后边 , AFTER / BEFORE ) 将元素从一个列表转入到另一个列表 : RPOPLPUSH chace_name chace_name2 (此命令会从 name1 最右边弹出一个 加入到name2 的左边)

$chace_name = array(
    0 => zhangsan
    1 => lisi
    2 => wangwu
);

4, 无序集合类型, 命令:

应用场景: 目前观象台应用到权限列表中, 赋值: SADD chace_name string(a b) (如果 a 存在 那么将追加b) 删除: SREM chace_name string(a b c) 取值: SMEMBERS chace_name (获取集合中所有的元素) 验证: SISMEMBERS chace_name (判断一个元素是否在集合中, 是返回1, 否返回0 ) 集合间运算 两个参数取差集: SDIFF setA setB 此命令用于A-B 的差集 以A为主 A{1,2,3} B{2,3,4} A-B = {1} 多个参数取差集: SDIFF setA setB setC 此命令支持 多个参数取差集 (先计算A-B 在用结果 与C 取差集) 两个参数取交集: SINTER setA setB 此命令用于A 与 B的交集 多个参数取交集: SINTER setA setB setC 此命令支持多个参数取交集 两个参数取并集: SUNION setA setB 代表所有属于A 或属于B的元素构成的集合 A{1,2,3} B{2,3,4} = {1,2,3,4} 多个参数取并集: SUNION setA setB setC 此命令支持多个参数取并集 获取集合中元素的个数: SCARD chace_name (return 个数) 获取集合中的随机元素: SRANDMEMBER chace_name 随机弹出一个元素: SPOP chace_name 从列表左边弹出一个元素: LPOP chace_name 获取集合中指定个数随机元素: SRANDMEMBER chace_name 5(第二个参数为个数,正数(获取不重复的值,如个数大于元素总个数将获取所有 , -5(负数将会获取指定个数的元素, 会出现重复元素))) 总结: SADD命令 用来向集合增加一个或多个元素, 如果键不存在 则自动创建. (在一个集合中不能有相同的元素) 元素在redis 中存储格式为一维数组

5, 有序集合, 命令 :

应用场景: 适用于文章访问量, 考试分数, 等等. 存储格式array(lisi,80,zs,90,xzq,100) 赋值: ZADD chace_name 80 lisi 90 zs 100 xzq (分数支持正数, 科学技术法, 双精度浮点数 17E+307 xzq , 10.8 xzq) 修改: ZADD chace_name 200 xzq 取值: ZSCORE chace_name xzq (return '200' ) 取值并携带分数: ZRANGE chace_name 0 -1 WITHSCORES (在末尾增加 WINTHSCORES 参数) (return {lisi:80 , zs:90 , xzq:100}) 取值并携带分数: ZREVRANGE chace_name 0 -1 WITHSCORES (return 结果 为从大到小返回结果的) 获取分数在某个范围元素列表 : ZRANGE chace_name 50 80 (return {zhangsan,lisi}) (索引是从0开始, -1从后向前查找) 跳跃性取值: ZRANGEBYSCORE chace_name 50 +inf limit 1 3 (获取分 数高于50分 并且从第二个人开始的, 从小到大开始排序) 增加元素分数: ZINCRBY chace_name 20 xzq (return 120 返回结果为 更改后的分数) (个人认为适用于点击量,访问量等) 减少元素分数: ZINCRBY chace_name -10 xzq (return 110 返回结果为更改后的分数) 其他命令: 获取有序集合中的个数: ZCARD chace_name 获取指定分数范围的元素个数 : ZCOUNT chace_name 80 100 删除一个或多个元素 : 按照排名范围删除元素 : 按照分数范围删除元素 : 计算有序集合的交集 : 总结 : 列表不能简单的条整某个元素的位置,而有序集合要比列表烈性更耗内存, 有序集合类型算是redis中最高级的类型了,有序集合为每一个元素都关联了一个分数, 虽然集合中每个元素都是不同的,但是他们的分数 却可以相同. 有序集合类型在某些方面与列表类型有些相似(具体区别查看相关文档)

flushall ——> 清空整个 Redis 服务器的数据(删除所有数据库的所有 key ) flushdb ——> 清空当前数据库中的所有 key

6, Redis 任务队列

1 , 什么是任务队列 :

超市买东西 -> 排队 -> 结账

2 , 使用Redis 实现任务队列

实现简单的任务队列 : 可使用 LPUSH 和 RPOP

使用 python 实现任务队列

连接远程redis

redis-cli -h 127.0.0.1 -p 6379 -a 123456