文章目录
*深入理解Redis*一、什么是NoSQL二、NoSQL的四大分类三、Redis是什么?四、Redis的基础知识①“select index”命令进行切换数据库②“dbsize”命令查看数据库的大小③“keys *”命令查看当前数据库中所有的键④“flushdb”命令清除当前数据库,“flushall”命令清除所有数据库⑤“exists key”命令判断某个键是否存在,不存在为0,存在为1⑥“move key 1”命令移除当前数据库某个键,1代表当前库⑦“expire key 10”命令设置某个键的过期时间,单位是秒,10秒;“ttl key”命令查看某个键剩余时间,-2代表已过期,自动过期,不存在了⑧“type key”命令查看某个键是什么类型 五、Redis五大基础数据类型字符串(String)1:(set key value)命令设置值,(get key)命令获取值2:(append key “str”)命令在某个键后追加字符串,如果当前key不存在就相当于set key了3:(strlen key)命令获取某个键,字符串的长度4:关于加1(incr key)命令和减1(decr key)命令的操作(常用于点赞量,例 如,set count 0,加 incr count/减 decr count),实现步长,加10(incrby count 10),减10(decrby count 10)5:(getrange key startIndex endIndex)命令获取范围内的字符串,左右都是闭区间,getrange key 0 -1 查看全部字符串6:(setrange key index value)命令替换指定位置开始的字符串7:(setex key 秒 value)命令设置过期时间,set with expire8:(setnx key value),不存在key在设置,表示当前key如果是存在的,就不会设置成功,set if not exist,在分布式锁中会常常使用9:(mset key1 value1 key2 value2 key3 value3)命令批量设置值,(mget key1 key2 key3)命令批量获取值10:(msetnx key1 value1 key4 value4)命令不会设置成功,返回值0,因为key1是存在的,即使key4是不存在的,也不会设置成功,原子性的操作,要么一起成功,要么一起失败11:(set user:1 {name:zzy,age:18}),设置user:1对象,json字符串来保存对象,不推荐;(mset user:1:name zzy user:1:age 18)批量设置,推荐;这里的key是一个巧妙的设计,user:{id}:{属性名};(mget user:1:name user:1:age)批量获取12:(getset key value)命令先get,然后在set 散列(Hash)1:(hset key mapkey mapvalue)命令设置值,(hget key mapkey)命令获取值2:(hmset key mapkey1 mapvalue1 mapkey2 mapvalue2)命令批量设置值,(hmget key mapkey1 mapkey2)命令批量获取值3:(hgetall key)命令获取key中全部hash值4:(hdel key mapkey)命令删除值5:(hlen key)命令获取hash键值对的长度6:(hexists key mapkey)命令判断hash中指定的字段是否存在7:(hkeys key)命令获取hash中所有的key8:(hvals key)命令获取hash中所有的value9:(hincrby key mapkey 1)命令hash值增量10:(hsetnx key mapkey mapvalue)命令如果hash不存在则可以设置,存在的话不能设置,常用于分布式锁 列表(List)1:(lpush key value)命令模拟栈,后进先出,插入到列表头部2:(rpush key value)命令模拟队列,先进先出,插入到列表尾部,(lrange key 0 -1)命令获取全部列表3:(lpop key)命令左侧移除元素,移除列表第一个元素,(rpop key)命令右侧移除元素,移除列表最后一个元素4:(lindex key index)命令获取列表某一个索引的值5:(llen key)命令获取列表的长度6:(lrem key 个数 value)命令移除多个value,从头到尾,精确匹配7:(ltrim key start stop)命令通过下标截取指定的长度,start=1,stop=2,数字为索引,左右闭区间8:(rpoplpush key 其它list的key)命令移除列表最后一个元素,插入到列表头部9:(lset key index item)命令列表根据索引进行更新操作10:(linsert key before/after “word” “other”)命令在指定元素前面/后面插入新元素 集合(Set)1:(sadd key value)命令集合中新增元素,(smembers key)命令查看集合所有元素2:(sismember key value)命令查看某个值是否存在于集合中,1存在,0不存在3:(scard key)命令获取集合元素的个数值4:(srem key value)命令移除集合中的某一个元素5:(srandmember key count)命令随机抽取几个元素,类似抽奖,count不写为抽取一个元素6:(spop key)命令随机移除集合中的一个元素7:(smove key otherkey value)命令将一个指定的值,移动到另外一个set集合8:微博关于共同关注(数学中为并集),数字集合类(差集、交集、并集) 有序集合(Zset)1:(zadd key 1 value)命令新增一个元素,1代表顺序;(zadd key 1 value 2 value)命令新增多个元素,1、2代表顺序;(zrange key 0 -1)命令获取全部元素2:(zrangebyscore key -inf +inf)命令按照score排序,从小到大,-inf负无穷,+inf正无穷,-inf与+inf也可以是具体的数字,顺序不可颠倒3:(zrangebyscore key -inf +inf withscores)命令比较上一条多一个score数据4:(zrem key value)命令移除集合中的元素5:(zcard key)命令获取有序集合元素的个数值6:(zrevrange key 0 -1)命令从大到小进行排序,反转7:(zcount key scorestart scoreend)命令获取指定区间的成员数量 总结
深入理解Redis
一、什么是NoSQL
★NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称,键值对存储、列存储、文档存储、图形数据库(社交关系)。
★关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。
★NoSQL特点
1:方便扩展(数据之间没有关系,很好扩展)
2:大数据量高性能(Redis一秒写8万,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)
3:数据类型是多样型的(不需要事先设计数据库,随取随用)
★大数据的3V(主要是描述问题的)
海量(Volume)
多样(Variety)
实时(Velocity)
★大数据的3高(主要是对程序的要求)
高并发
高可扩
高性能
二、NoSQL的四大分类
★KV键值对:
新浪:Redis
美图:Redis+Tair
阿里、百度:Redis+Memecache
★文档型数据库(使用Bson格式,与Json格式一样)
MongoDB(一般必须要掌握),是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档。MongoDB是一个介于关系型数据库和非关系型数据库中中间的产品!MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的。另一个文档型数据库为ConthDB。
★列存储数据库
HBase
分布式文件系统
★图关系数据库
它不是存储图形,放的是关系,比如:朋友圈社交网络,广告推荐!(Neo4j,InfoGrid)
三、Redis是什么?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。免费和开源!是当下最热门上午NoSQL技术之一!也被人们称之为结构化数据库!
官网:
https://redis.io/
中文网:
http://www.redis.cn/
Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习的!
四、Redis的基础知识
★Redis默认有16个数据库(配置文件redis.conf中有,默认使用第0个数据库;端口号6379)
①“select index”命令进行切换数据库
②“dbsize”命令查看数据库的大小
③“keys *”命令查看当前数据库中所有的键
④“flushdb”命令清除当前数据库,“flushall”命令清除所有数据库
⑤“exists key”命令判断某个键是否存在,不存在为0,存在为1
⑥“move key 1”命令移除当前数据库某个键,1代表当前库
⑦“expire key 10”命令设置某个键的过期时间,单位是秒,10秒;“ttl key”命令查看某个键剩余时间,-2代表已过期,自动过期,不存在了
⑧“type key”命令查看某个键是什么类型
★Redis是单线程的,是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis是所有的数据全部放到内存中的,所以说使用单线程操作效率就是最高的,多线程(CPU上下文会切换,耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存情况下,这个就是最佳方案。可以用作数据库、缓存、消息中间件MQ。
官方命令大全:
https://redis.io/commands/
五、Redis五大基础数据类型
字符串(String)
String类似的使用场景,value除了是字符串,还可以是数字。计数器、统计多单位的数量,关注数,粉丝数,对象缓存存储。
1:(set key value)命令设置值,(get key)命令获取值
2:(append key “str”)命令在某个键后追加字符串,如果当前key不存在就相当于set key了
3:(strlen key)命令获取某个键,字符串的长度
4:关于加1(incr key)命令和减1(decr key)命令的操作(常用于点赞量,例 如,set count 0,加 incr count/减 decr count),实现步长,加10(incrby count 10),减10(decrby count 10)
5:(getrange key startIndex endIndex)命令获取范围内的字符串,左右都是闭区间,getrange key 0 -1 查看全部字符串
6:(setrange key index value)命令替换指定位置开始的字符串
7:(setex key 秒 value)命令设置过期时间,set with expire
无Key时,新增操作,附加过期时间
有Key时,修改操作,附加过期时间
8:(setnx key value),不存在key在设置,表示当前key如果是存在的,就不会设置成功,set if not exist,在分布式锁中会常常使用
9:(mset key1 value1 key2 value2 key3 value3)命令批量设置值,(mget key1 key2 key3)命令批量获取值
10:(msetnx key1 value1 key4 value4)命令不会设置成功,返回值0,因为key1是存在的,即使key4是不存在的,也不会设置成功,原子性的操作,要么一起成功,要么一起失败
11:(set user:1 {name:zzy,age:18}),设置user:1对象,json字符串来保存对象,不推荐;(mset user:1:name zzy user:1:age 18)批量设置,推荐;这里的key是一个巧妙的设计,user:{id}:{属性名};(mget user:1:name user:1:age)批量获取
12:(getset key value)命令先get,然后在set
散列(Hash)
使用场景:hash存一些变更数据,用户信息的保存,经常变动的信息,hash更适合对象的存储,这时候value是map集合(hash),所有的hash命令都是英文“h”开头的,本质和string类型没有太大的区别,还是一个简单的key-value。
1:(hset key mapkey mapvalue)命令设置值,(hget key mapkey)命令获取值
2:(hmset key mapkey1 mapvalue1 mapkey2 mapvalue2)命令批量设置值,(hmget key mapkey1 mapkey2)命令批量获取值
3:(hgetall key)命令获取key中全部hash值
4:(hdel key mapkey)命令删除值
5:(hlen key)命令获取hash键值对的长度
6:(hexists key mapkey)命令判断hash中指定的字段是否存在
7:(hkeys key)命令获取hash中所有的key
8:(hvals key)命令获取hash中所有的value
9:(hincrby key mapkey 1)命令hash值增量
10:(hsetnx key mapkey mapvalue)命令如果hash不存在则可以设置,存在的话不能设置,常用于分布式锁
列表(List)
使用场景:消息排队、消息队列、栈;
实际是一个链表,before/after/left/right都可以插入值;
如果key不存在,创建新的链表,如果key存在,新增内容;
如果移除了所有值,空链表,也代表不存在;
在两边插入值或者改动值,效率高,中间元素,相对来说效率会低一点;
基本的数据类型,列表,可以模拟队列(先进先出)、栈(后进先出)、阻塞队列,所有的list命令都是英文“l”开头的,可以存在重复值
1:(lpush key value)命令模拟栈,后进先出,插入到列表头部
2:(rpush key value)命令模拟队列,先进先出,插入到列表尾部,(lrange key 0 -1)命令获取全部列表
3:(lpop key)命令左侧移除元素,移除列表第一个元素,(rpop key)命令右侧移除元素,移除列表最后一个元素
4:(lindex key index)命令获取列表某一个索引的值
5:(llen key)命令获取列表的长度
6:(lrem key 个数 value)命令移除多个value,从头到尾,精确匹配
7:(ltrim key start stop)命令通过下标截取指定的长度,start=1,stop=2,数字为索引,左右闭区间
8:(rpoplpush key 其它list的key)命令移除列表最后一个元素,插入到列表头部
9:(lset key index item)命令列表根据索引进行更新操作
10:(linsert key before/after “word” “other”)命令在指定元素前面/后面插入新元素
集合(Set)
使用场景:共同爱好,二度好友,推荐好友(六度分割理论)
set中的值是不能重复的,所有的set命令都是英文“s”开头的,无序不重复集合,抽随机
1:(sadd key value)命令集合中新增元素,(smembers key)命令查看集合所有元素
2:(sismember key value)命令查看某个值是否存在于集合中,1存在,0不存在
3:(scard key)命令获取集合元素的个数值
4:(srem key value)命令移除集合中的某一个元素
5:(srandmember key count)命令随机抽取几个元素,类似抽奖,count不写为抽取一个元素
6:(spop key)命令随机移除集合中的一个元素
7:(smove key otherkey value)命令将一个指定的值,移动到另外一个set集合
8:微博关于共同关注(数学中为并集),数字集合类(差集、交集、并集)
差集:(sdiff key otherkey)—>key为参照物,去掉与otherkey相同的元素
交集:(sinter key otherkey)—>key与otherkey共同的部分
并集:(sunion key otherkey)—>key与otherkey的全部元素
有序集合(Zset)
在set的基础上,增加了一个值,set k1 v1 —>zset k1 score1 v1
案例思路:set排序 存储班级成绩表,工资表排序,排行榜应用实现
普通消息,1/ 重要消息,2,带权重进行判断
1:(zadd key 1 value)命令新增一个元素,1代表顺序;(zadd key 1 value 2 value)命令新增多个元素,1、2代表顺序;(zrange key 0 -1)命令获取全部元素
2:(zrangebyscore key -inf +inf)命令按照score排序,从小到大,-inf负无穷,+inf正无穷,-inf与+inf也可以是具体的数字,顺序不可颠倒
3:(zrangebyscore key -inf +inf withscores)命令比较上一条多一个score数据
4:(zrem key value)命令移除集合中的元素
5:(zcard key)命令获取有序集合元素的个数值
6:(zrevrange key 0 -1)命令从大到小进行排序,反转
7:(zcount key scorestart scoreend)命令获取指定区间的成员数量
总结
每天一个提升小技巧!!!