概述
SQL与NOSql对比:
SQL | NOSql | Redis其它特点 | |
1 | 行存储、二维 | 非结构化的数据 |
Transactions(事务) |
2 | 结构化、Schema | 数据与数据没有关联 |
Pub/Sub(发布/订阅) |
3 | ACID | BASE:最终一致性 |
Lua scripting(Lua脚本) |
4 | 表与表之间的关联 | 海量数据存储 |
Keys with a limited time-to-live(TTL) |
5 | SQL语法 | 高并发读写 |
LRU eviction of keys(最近使用淘汰key) |
6 | 分布式:数据分片、扩缩容简单 |
Automatic failover (自动故障转移) |
NoSQL分类:
1、KV存储 2、文档存储 MongoDB 3、列存储 HBase 4、图存储 Graph Neo4j 5、对象存储 6、XML存储
7、...
Redis对外的数据类型
数据类型 1、String 4、Set 2、Hash 5、ZSet 3、List 6、Geo spatial
7、hyperloglog 8、stream
1、数据类型:String
常用命令:
1、set / get :单条写/读 (eg:set f 2.7 / get f) 2、mset / mget :批量写/读 (eg: mset qinshan 2243 jack 66777 / mget qinshan jack) 3、incr / decr :递增/递减,距离为1 (eg:incr id / decr id) 4、incrby / decrby / incrbyfloat :整型递增/整形递减/浮点型递增 可以指定递增/递减的长度/距离 (eg: decrby qinshan 100) 5、strlen :获取value的字符串长度(eg:strlen qinshan) 6、append :字符串连接,类似java中的StringBuilder的append(eg:append goodName _suffex) 7、getrange :获取指定范围的字符串,类似java中的subString(eg:getrange qinshan 0 8)
2、数据类型:Hash
常用命令:
hset / hget : 单条往hash表中写/读 (eg:hset <hash表> <key> <value>) hmset / hmget :批量往hash表中写/读 (eg:hset <hash表> <key> <value> [<key> <value>]) hkeys :获取指定hash表中的所有key (eg:hkeys <hash表>) hvals :获取指定hash表中的所有value (eg:hvals <hash表>) hgetall :获取指定hash表中的所有key-value (eg:hgetall <hash表>) hget exists :获取存在的key (eg:hvals <hash表> <field>) hdel :删除hash表(eg:hdel <hash表>) hlen :查询hash表大小(eg:hlen <hash表>)
hincrby / hdecrby : 递增 / 递减
3、数据类型:List
概述:有序,左边(left)是列头,右边(right)是列头,且支持从列表左端操作也支持从右端操作
常用命令:
1、lpush / rpush :非阻塞,从左边(列头)/ 右边(列尾)写入列表 (eg:lpush <key> <value> [<value>] ) 2、lpop / rpop :非阻塞,从列表左边(列头)/ 右边(列尾)弹出一个元素 (eg:lpop <key> )
3、blpop :阻塞模式,从列表左边(列头)弹出一个元素,可以指定超时时间,(eg: blpop <key> <timeout> 该模式可以实现一个分布式队列) 4、lindex :从列表的左边(列头)开始获取指定索引位置的元素(eg:lindex queue 0) 5、lrange :从列表中获取指定范围的元素 (eg:获取整个列表 lrange queue 0 -1 / 获取一定范围的元素 lrange queue 14)
4、数据类型:Set
概述:无序,不重复的集合
常用命令:
1、sadd / amembers 写入集合/从集合中读 (eg:sadd <set-key> <value>[<value>] )(eg: amembers <set-key>) 2、scard :统计集合中元素的数量(eg: scard <set-key>) 3、srandmember key: 从集合中随机获取1/num个值 (eg:srandmember <set-key> [num]) 4、spop :从集合中弹出第一个元素(eg: spop <set-key>) 5、srem :从集合中移除指定的元素(eg: srem <set-key> <value> [<value>]) 6、sismember : 判断是否是集合中的元素 (eg: sismember <set-key> <value> [<value>] ) 7、sdiff:获取差集 (eg:sdiff set1 set2 只在第一个集合,不在第二个集合) 8、sinter :获取交集 (eg:sinter set1 set2 两个集合中都存在) 9、sunion : 获取并集 (eg: 合并后去重)
5、数据类型:ZSet
概述:有序,不重复的集合
常用命令:
1、zadd:往有序集合中写 (格式:zadd <zset-key> <score><value>[<score><value>]) 2、zrange : 获取指定范围的元素 (eg: zrange 0 -1 [withscore])其中 3、zrevrange: 获取反转集合:(eg:将集合根据分数反转 zrevrange <zset-key> <index-start> <index-end> [<withscores>]) 4、zrangebyscore:根据分值区间获取元素(eg: zrangebyscore <zset-key> <score1> <score2>) 5、zrem: 移除元素 (eg: zrem <zset-key> <value1> [<value2>]) 6、zcard : 统计集合中的元素数量 (eg: zcard <zset-key> ) 7、zincrby : 修改元素的分值(eg: 给指定的元素增加指定的分值 zincrby <zset-key><value> <score> ) 8、zcount: 计算有序集合中指定分数区间的成员数量(eg: zcount <zset-key><score-start> <score-end>) 9、zrank : 获取有序集合中指定元素的下标(eg:zrank <zset-key><member>) 10、zscore : 返回有序集中,成员的分数值 (eg: zscore <zset-key><member>)
6、数据类型:Geo Spatial
概述:主要用于存储地理位置信息
常用命令:
1、geoadd :添加地理位置的坐标。(格式:geoadd key longitude latitude member [longitude latitude member ...] ) 2、geopos :获取地理位置的坐标。(格式:geopos key member [member ...] ) 3、geodist :计算两个位置之间的距离。(格式:geodist key member1 member2 [m|km|ft|mi] )(m米,km千米,ft英尺,mi英里) 4、georadius :根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。(格式:georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]) 5、georadiusbymember :根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。(格式:georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]) 6、geohash :返回一个或多个位置对象的 geohash 值。(格式:geohash key member [member ...] )
注意:
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和维度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序
详情可以参考:https://www.runoob.com/redis/redis-geo.html
7、数据类型:Hyperloglog
概述:用来做基数统计的算法,优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
适合的场景:数据量大,但不需要特别精准的场景
常用命令:
1、pfadd :添加指定元素到 HyperLogLog 中 (格式:pfadd key element [element ...]) 2、pfcount :返回给定 HyperLogLog 的基数估算值。(格式:PFCOUNT key [key ...]) 3、pfmerge :将多个 HyperLogLog 合并为一个 HyperLogLog(PFMERGE destkey sourcekey [sourcekey ...]) 详情可以参考:https://www.runoob.com/redis/redis-hyperloglog.html
8、数据类型:Stream
概述: Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。 简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。 详情参考:https://www.runoob.com/redis/redis-stream.html