这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战web
# 切换数据库
SELECT index
# 当前数据库有的数据量
DBSIZE
# 清空当前数据库内容
FLUSHDB
# 清空全部数据库内容
FLUSHALL
复制代码
# 删除指定key(一个或多个)
DEL key [key ...]
# 序列化指定key的值
DUMP key
# 查询key是否存在
EXISTS key
# 设置一个key的过时时间(s)
EXPIRE key seconds
# 获取key的有效时间(s)(-1,永久有效;-2,无效,没有该key)
TTL key
# 移除key的过时时间
PERSIST key
# 查找全部匹配给定的模式的键(通配符: *: 表明全部; ?: 表明一个字符)
KEYS pattern
# 返回一个随机的key
RANDOMKEY
# 将一个key重命名
RENAME key newkey
# 重命名一个key,新的key必须是一个不存在的key
RENAMENX key newkey
# 移动一个key到另外一个数据库
MOVE key db
复制代码
EXPIRE key命令,应用场景redis
redis中单个key存入512M大小。算法
NOSQL中数据与数据间是没有任何关联的,经过命名来解决。数据库
string 是 redis最基本的数据类型,一个key对应一个value,一个键最大能存储512MB;json
string 类型是二进制安全的,意思是 redis 的string 能够包含任何数据,好比:jpg图片或序列化的对象。缓存
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,若是被攻击,可以及时检测出。安全
二进制安全特色:markdown
# 赋值语法
# 设置给定 key的值,若是key已经存在值,覆盖旧值,且无视类型
SET key value
# key不存在时,为key赋值;key存在,命令失效
SETNX key value // 重要,分布式锁问题
# 为多个key-value赋值
MSET key value [key value...]
# 追加一个值到key上,返回字符串长度
APPEND key value
复制代码
# 取值语法
# 返回 key 的value
GET key
# 获取存储在key上的值的一个字符串,start - end表示取值范围(0-x)
GETRANGE key start end
# 设置一个key的值,并获取设置前的值(应用场景普遍)
GETSET key value
# 获取指定key值的长度
STRLEN key
# 返回位的值存储在关键的字符串值的偏移量
GETBIT key offset
复制代码
# 删除语法
# 删除指定key,若是存在,返回数字类型(删除的个数)
DEL key
复制代码
# 自增、自减,并返回结果数
# 将key存储的值自增长一,若是key不存在,那么key的值会先初始为0,再执行incr操做
INCR key
# 将key存储的值自增自定义的数,若是key不存在,那么key的值会先初始为0,在执行incrby操做
INCRBY key increment
# 自减一
DECR key
# 自减自定义的值
DECRBY key increment
复制代码
**INCR 等指令自己就是具备原子操做的特性,**因此咱们彻底能够利用 INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。并发
很多网站都利用redis的这个特性来实现业务上的统计计数需求。分布式
hash 是一个string类型的 field 和 value 的映射表,hash特别适合用与存储对象。
redis 中能够存储 2^32 - 1 键值对(40多亿),能够看作具备KEY和VALUE的map容器,该类型很是适合于存储值对象的信息,如:uname,ugender,uage。该类型的数据仅占用不多的磁盘空间(相比于JSON)。
# 赋值语法
# 为指定的key,设定key/value.至关于 key:对象名 field:属性名 value:属性值
HSET key field value
# 同时将多个 field-value(域-值)对设置到哈希表key中
HMSET key field value [field value]...
复制代码
# 取值语法
# 取出 key 的field的值
HGET key field
# 取出 key 中多个field的值
HMGET key field [field...]
# 获取 key 的全部 field 和 value
HGETALL key
# 获取key中全部field
HKEYS key
# 获取 key 中field的数量
HLEN key
复制代码
# 删除语法
# 删除key中一个或多个field,当key的全部field的值都删除完了,redis会删除这个key
HDEL key field [field...]
复制代码
# 其余语法
# 只有key不存在时,设置字段的值
HSETNX key field value
# 为哈希表key中的指定字段的整数值加上增量increment
HINCRBY key field increment
# 为哈希表key中的指定字段的浮点数值加上增量increment
HINCRBYFLOAT key field increment
# 查看哈希表key中,指定的field是否存在
HEXISTS key field
复制代码
经常使用于存储一个对象;
为何不用string存储一个对象?
hash是最接近关系型数据库结构的数据类型,能够将数据库一条记录或程序中一个对象转换成hashmap存放到redis中;
用string存储对象的两种方式:
例:key:id,value:{json串}
复制代码
例:
key:user:id 1
user:name xiaojian
user:age 22
复制代码
简单的字符串列表,按照插入顺序排序。能够添加一个元素到列表的头部(左边)或尾部(右边)
List 存入的元素的结构就像栈堆,先进后出
相似于 Java 的 LinkedList
127.0.0.1:6379> lpush list2 1
(integer) 1
127.0.0.1:6379> lpush list2 2
(integer) 2
127.0.0.1:6379> lpush list2 3
(integer) 3
127.0.0.1:6379> lpush list2 3
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "3"
3) "2"
4) "1"
复制代码
# 赋值语法
# 从列表左边存入一个或多个元素
LPUSH key value[value...]
# 当列表存在时,从列表左边存入一个(列表不存在,没法存入)
LPUSHX key value
# 从列表右边存入一个或多个元素
RPUSH key value[value...]
# 当列表存在时,从列表右边存入一个(列表不存在,没法存入)
RPUSHX key value
# 在列表中的另外一个元素以前或以后插入一个元素
LINSERT key BEFORE|AFTER pivot value
如:linsert list1 BEFORE "c" "b" # 在元素 "c" 以前插入 "b"
# 根据索引,设置列表里面一个元素的值
LSET key index value
复制代码
# 取值语法
# 经过其索引获取一个元素
LINDEX key index
# 从列表获取指定范围内的元素,start和stop偏移量为 -1 指最后一个元素,-2指倒数第二个,一次类推
LRANGE key start stop
# 获取列表长度
LLEN key
# 截取指定范围的数据,列表中的数据改变成截取的数据
LTRIM key start stop
复制代码
# 删除语法
# 从列表最左边移除一个元素,并返回这个元素
LPOP key
# 从列表最右边移除一个元素,并返回这个元素
RPOP key
# 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。
# count为正数时,移除前count个;为负数时,移除后count个;为0,移除全部value
LREM key count value
复制代码
对数据量显示、关注列表、粉丝列表、留言评价等...分页、热点新闻(Top5)等;
利用 LRANGE 还能够很方便的实现分页的功能;在博客系统中,每篇博文的评论也能够存入一个单独的list中。
任务队列
list一般用来实现一个消息队列,并且能够确保前后顺序,没必要像MySQL那样还须要经过 ORDER BY来进行排序
#任务队列介绍(生产者和消费者模式):
# 在处理web客户端发送的命令请求时,某些操做的执行时间可能会比咱们预期的更长一些,经过将待执行任务的相关信息放入队
列里面,并在以后对队列进行处理,用户能够推迟执行那些须要一段时间才能完成的操做,这种将工做交给任务处理器来执行的作法
被称为任务队列(task queue)。
RPOPLPUSH source destination
# 一处列表的最后一个元素,并将该元素添加到另外一个列表并返回(对同一个list使用,把最后一个元素,调到首个)
复制代码
不容许存在重复元素的集合,无序
Redis集合时经过哈希表实现的,因此添加,删除,查找的复杂度都是 O(1),
set是经过 hashtable
实现的,
集合中的最大成员数为 2^32^ - 1(4294967295,每一个集合可存储40多亿个成员)
相似 Java 中的成员 Hashtable
集合
# 赋值语法
# 添加一个或多个元素
SADD key member [member...]
复制代码
# 取值语法
# 获取集合中全部元素
SMEMBERS key
# 获取集合长度
SCARD key
# 判断 member 元素是不是集合 key 的成员(开发中:验证是否存在判断)
SISMEMBER key member
# 返回集合中一个或多个随机数
SRANDMEMBER key [count]
# 差集语法:
SDIFF key1 [key2] : 返回给定 key1 集合与其余集合的差集
SDIFFSTORE destination key1 [key2] : 返回给定全部集合的差集并存储在 destination 中(destination是一个新建的key的名称)
# 交集语法:
SINTER key1 [key2] : 返回给定全部集合的交集(共有数据)
SINTERSTORE destination key1 [key2] : 返回给定全部集合的交集并存储在 destination 中(destination是一个新建的key的名称)
# 并集语法:
SUNION key1 [key2] : 返回全部给定集合的并集
SUNIONSTORE destination key1 [key2] : 返回给定全部集合的并集并存储在 destination
复制代码
# 删除语法
# 删除一个或多个元素
SREM key member1 [member2]
# 移除并返回集合的一个随机元素
SPOP key [count]
# 将 member 元素从 source 集合移动到 destination 集合
SMOVE source destination member
复制代码
常应用于:对两个集合间的数据 [计算] 进行交集、并集、差集运算
有序集合(sorted set)
不容许重复元素,且元素有序
插入元素时都会关联一个double类型的分数(score),以分数从小到大排序
有序集合的成员是惟一的,但分数(score)却能够重复
(咱们将在redis中的有序集合叫作zsets,这是由于在 redis 中,有序集合相关的操做指令都是以z开头的)
# 赋值语法
ZADD key score member [score member...]
复制代码
# 取值语法
# 获取有序集合的成员数
ZACARD key
# 计算在有序集合中指定区间分数的成员数
ZCOUNT key min max
# 返回有序集合中指定成员的索引
ZRANK key member
# 经过索引区间返回有序集合中指定区间的成员(0,-1)
ZRANGE key start end [WITHSCORES]
# 经过分数返回有序集合指定区间内的成员
ZRANGBYSCORE key min max [WITHSCORES] [LIMIT]
# 返回有序集合指定区间内的成员,经过索引,分数从高到低
ZREVRANGE key start stop [WITHSCORES]
# 返回有序集合指定分数区间内的成员,经过索引,分数从高到低
ZREVRANGEBySCORE key max min [WITHSCORES]
复制代码
# 删除语法
# 移除集合
DEL key
# 移除有序集合中的一个或多个成员
ZREM key member [member ...]
复制代码
常应用于:排行榜
销量排名,积分排名等
Redis 在2.8.9 版本添加了 HyperLogLog 结构
Redis HyperLogLog 是用来作基数统计的算法,HyperLogLog 的优势是,在输入元素的数量或体积很是大时,计算基数所需的空间老是固定的,而且是很小的
复制代码
在 Redis 里面,每一个 HyperLogLog 键只须要花费 12 KB内存,就能够计算接近 2^64 个不一样元素的基数。这和计算基数时,元素越多耗费内存就越多的集合造成鲜明对比。
可是,由于 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素自己,因此 HyperLogLog 不能像集合那样,返回输入的各个元素。
复制代码
什么是基数?
好比数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5。
基数估计就是在偏差可接受的范围内,快速计算基数.
复制代码
# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
# 返回给定 HyperLogLog 的基数估算值
PFCOUNT key [key ...]
# 将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]
复制代码
基数不大,数据量不大就用不上,会有点大材小用浪费空间
有局限性,就是只能统计基数数量,而没有办法知道具体内容是什么
统计注册 IP 数
统计每日访问 IP 数
统计页面实时 UV 数
统计在线用户数
统计用户天天搜索不一样词条的个数
统计真是文章阅读数
复制代码