概念
redis数据库是一个用C语言开发的高性能键值对数据库,支持多种键值对的存储类型。
根据官网的描述,redis的读写性能是相当之高的。
读性能:每秒11万次
写性能:每秒8万次
redis的所有存储方式都是以key-value的形式存储的,按照不同的场景需求,redis的value支持多种数据结构
包括以下5种:
- 字符串
- 哈希
- 字符串列表
- 字符串集合
- 有序字符串集合
针对以上不同的数据结构,可以应用于不同的场景需求。
目前对redis的应用主要有以下这些场景:
- 缓存,字典数据,新闻,在线聊天室,好友列表
- 任务队列,秒杀,抢购
- 应用排行榜
- 网站访问统计
- 数据过期的处理
- 分布式集群架构的session的分离
字符串
操作类型:赋值,取值,更新值,删值,数值增减,字符串追加
- 赋值
- 命令 : set key value
- 取值
- 命令:get key
- 更新值
- 命令 getset key newvalue
- 删除
- 命令 del key
- 增减值
- 命令 -- 自动累加1 incr key
- 命令-- 自动减1 decr key
- 命令 -- 设定增长值 incrby key 5
- 命令-- 设定减少值 decrby key 5
- 追加 -- 给已有的key的value字符串后面追加字符,如果key不存在则以空字符串追加
- 命令-- append key appendvalue
哈希
哈希顾名思义,相当于java的集合对象Map
操作类型有:赋值,取值,删除,判断是否存在,获取哈希的长度,获取哈希的所有key,获取哈希的所有value
- 赋值 hset命令
- 命令:hset person name jack --意思是创建一个key为person的哈希【当person存在则不用创建】,其哈希里边有一对键值对,key为name,value为jack
- 同时给哈希赋值多个key
- 命令: hset person name jack age 18 --意思是给person这个hash赋予两个key ,分别为 name:jack , age:18
- 取值 hget命令
- 命令:hget person name
- 获取多个值
- 命令:hget person name age
- 获取整个哈希对象 hgetall 命令
- 命令: hgetall person
- 删除 hdel
- 删除哈希里的某个key
- hdel person name --删除person这个哈希的 name属性
- 删除整个哈希 del[跟删除字符串用的是同个命令]
- del person
- 判断哈希里是否存在某个值
- hexists person name --判断哈希person里是否有name这个key,如果有则返回1 ,没有则返回0
- 获取哈希的长度 hlen
- 命令 hlen person 返回2
- 获取哈希的所有key hkeys
- 命令:hkeys person 返回 name age
- 获取哈希的所有value hvals
- 命令:hvals person 返回 jack 18
字符串列表
字符串列表相当于java里的 LinkedList<String>对象,数据存进去后是有先后顺序的,它支持从左往右,从右往左各种方式索引数据。常用场景有用来做消息队列。
- 存值
- 命令:lpush rpush [l:left r:right]
- lpush mylist a b c d e -- 表示往 列表mylist 里从左边依次塞入值 a b c d e, lpush相当于是压栈操作,在mylist里边的数据顺序是e d c b a
- rpush mylist2 1 2 3 4 5 -- 表示往 列表mylist2 里从右边依次塞入值 1 2 3 4 5, rpush相当于是压栈操作,在mylist2里边的数据顺序是 1 2 3 4 5
- 取值
- 命令:lrange
- lrange mylist 0 3 代表获取下标 0 到3 的所有元素,返回 e d c b
- lrange mylist 0 -1 获取整个列表
- lrange mylist 0 -2 获取下标为0 到 倒数第二个
- 出栈操作:lpop rpop lpop从左边弹出一个元素,rpop从右边弹出一个元素,弹出后,列表里将减少了一个弹出的那个元素
- lpop mylist -- 从mylist的左边弹出一个元素,return e
- lpushx 往数组的左边插入值,只插入一个值
- 命令:lpushx mylist x
- 删除值,可以使用命令 lrem
- lrem mylist n val 代表从左边删除数组里边的数据,从左边数起删除n个值为val的值
- lrem mylist 3 a ,代表从左边往右边数,删除3个a
- lrem mylist -2 b 前面的-负数代表从右边数起,删除2个b
- lrem mylist 0 c 代表删除数组中所有c的对象
- 更新值
- lset 往数组的某个位置赋予新的值
- lset mylist 3 d 代表将原先下标为3的值改为d
- 插入值linsert
- 如果mylist的数组为 1 2 3 4 5
- 想要在3前面插入值为a,则需要使用命令 linsert mylist before 3 a
- 想要在3后面插入值为b,则需要使用命令 linsert mylist after 3 b
集合
集合里的字符串元素是无序的,相当于java的Set<String>
- 添加 使用命令 sadd
- sadd myset a b c
- 删除 使用命令srem
- srem myset a b
- 取值 smembers sismember
- 获取当前set集合的所有内容 smembers myset
- 判断当前集合中是否存在某个值 sismember myset a 存在返回 1 ,不存在返回 0
- 获取集合总数 使用命令scard
- scard myset return 3
- 随机取出一个元素 使用命令srandmember
- srandmember myset
- 交集 使用命令 sinter ,可以将两个集合中存在相同的元素找出来
- 比如 myset1 [1,2,3,4] myset2[1,4,5]
- 执行命令后 sinter myset1 myset2 最后得出结果 [1,4]
- 交集结构存放新的地方 使用命令sinterstore
- sinterstore resultset myset1 myset2
- 并集 使用命令 sunion ,可以将两个集合的元素合并起来
- 比如 myset1 [1,2,3,4] myset2[1,4,5]
- 执行命令后 sunion myset1 myset2 最后得出结果 [1,2,3,4,5]
- 并集结构存放新的地方 使用命令sunionstore
- sunionstore resultset myset1 myset2
- 差集 使用命令 sdiff ,可以找出第一个集合中有的但是第二个集合中不存在的元素
- 比如 myset1 [1,2,3,4] myset2[1,4,5]
- 执行命令后 sdiff myset1 myset2 最后得出结果 [2,3]
- 差集结构存放新的地方 使用命令sdiffstore
- sdiffstore resultset myset1 myset2
有序集合 sortSet
有序集合其实是set里边的每个元素有权重的概念,搜索数据时可以按照权重排序得到数据
- 增加元素,可以使用命令 zadd key score item1 score item2 ......
比如 增加一个有序列集合 zadd zset 8 zjc 9 wkq 10 lmy
- 重新修改某个元素的分数
zadd zset 11 zjc --把zjc的分数改为11
- 获取元素zjc的分数
zscore zset zjc
- 获取有序列的元素数量
zcard zset
- 删除元素
zrem zset zjc
- 查询有序集合里所有元素
zrange zst 0 -1
- 查询所有有序集合带上分数
zrange zset 0 -1 withscores
- 查询所有有序集合,按倒叙输出
zrevrange zset 0 -1
- 按照范围进行删除集合的数据
zremrangebyrank zset 0 3 -- 代表删除从0到3的元素
- 按照分数范围进行删除集合中的元素
zremrangebyscore zset 8 10 --代表删除zset集合中分数在 8 到10 的元素
- 按照分数范围查询数据
zrangebyscore zset 0 10 withscores --查询出分数在0 到10分的所有元素
zrangebyscore zset 0 10 withscores limit 0 2 --查询出分数在0 到10分的所有元素的前两个元素
- 给某个元素增加分数
zincrby zset 5 zjc --给zjc这个元素增加5分
- 统计元素的数量 zcount
zcount zset 8 10 --统计zset中分数在8到10之间的元素有多少个