1.NoSQL介绍
NoSQL(Not Only SQL) 泛指非关系型数据库。NoSQL数据库并不是取代关系型数据库,而是关系型数据库的补充 。
关系型数据库(RDBMS): Relational Database Management System。全都是以表的形式存储数据,以约束维护数据关系,有事务
-
数据、操作都非常的严谨,不容易出错
-
三高问题:
高并发问题:关系型数据库如果要提供高并发的能力,需要的代价比较大。
高性能问题:快速从海量数据里找到并操作某些数据,成本高昂
高扩展性问题:集群+分布式,数据库增加、减少节点,或者做数据的迁移 都非常麻烦
-
比如:Mysql,Oracle,DB2,SQLServer
非关系型数据库(NoSql): 泛指一切不以表形式存储数据、不使用约束维护关系的数据库
- 特点:更大的优势是在于“灵活”,而不是“严谨”
- 存储数据的模式非常灵活。不以表的形式存储,以什么形式存储的?有各种各样不同的数据库,采用不同的存储形式
- 扩展性和操作性能非常好。这些数据库都是在 大数据量、高并发的情况下,逐渐产生的一些解决方案数据库
- 非关系型数据库,通常缺乏有效的事务管控。
- 例如:
- Redis:键值对结构的数据库。可以把Redis看成一个超级大的独立的HashMap。性能极强
- MongoDB:文档型数据库。每一条数据存储成一个json对象
- HBase:列式数据库。可以很方便的存储海量的数据
- Neo4J:图数据库。更适合于维护拓扑结构的关系,比如社交关系
- ……
2.Redis介绍
Redis是用C语言开发的一个开源的高性能键值对数据库,而且为了进一步提升性能,Redis把数据存储到内存里,所以它有极高的读写性能。
3.Redis数据类型 ★
五种常用数据类型
Redis的数据,是键值对结构的 key-value
key : 始终是字符串或者字节数组。最大512MB
value :又分为5种常用的类型
- string:字符串
- hash:哈希结构。相当于Java里的HashMap
- list:链表结构。相当于Java里的LinkedList
- set:无序不重复的数据集合。相当于Java里的HashSet
- zset:也叫sorted set,有序不重复的集合
Redis常用命令
1.字符串操作命令
| 命令 | 说明 |
|---|---|
| set key value | 存储数据。如果key已经存在,就覆盖掉它的value;如果key不存在,就存储进去 |
| get key | 获取key对应的value值 |
| del key | 删除key |
| setex key 秒数 value | 存储数据,并设置有效期,单位是秒 |
| setnx key value | 存储数据。但是只有在key不存在的情况下,才可以存储进去。如果key已存在,会存储失败 |
操作 :
127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set verify_code 123456
OK
127.0.0.1:6379> get verify_code
"123456"
127.0.0.1:6379> setnx verify_code 11111 # verify_code 存在存储失败
(integer) 0
127.0.0.1:6379> get verify_code
"123456"
127.0.0.1:6379> set verify_code 2222 # 直接覆盖verify_code
OK
127.0.0.1:6379> get verify_code
"2222"
127.0.0.1:6379> setex code 10 asdff
OK
127.0.0.1:6379> get code
"asdff"
127.0.0.1:6379> get code #10秒后自动消失
(nil)
2.哈希操作命令
| 命令 | 说明 |
|---|---|
| hset key field value | 存储数据。把field-value存储到key对应的hash表里 |
| hget key field | 获取数据。从key对应的hash表里,找到field对应的值 |
| hdel key field | 删除数据。从key对应的hash表里,删除掉field |
| hkeys key | 获取key对应的hash表中所有的field |
| hvals key | 获取key对应的hash表里所有的value |
| hgetall key | 获取key对应的hash中所有的field-value对 |
操作 :
127.0.0.1:6379> hset stu name tom
(integer) 1
127.0.0.1:6379> hset stu old 18
(integer) 1
127.0.0.1:6379> hset stu gender 1
(integer) 1
127.0.0.1:6379> hget stu name
"tom"
127.0.0.1:6379> hdel stu gender
(integer) 1
127.0.0.1:6379> hkeys stu
1) "name"
2) "old"
127.0.0.1:6379> hvals stu
1) "tom"
2) "18"
127.0.0.1:6379> hgetall stu
1) "name"
2) "tom"
3) "old"
4) "18"
3.列表操作命令
| 命令 | 说明 |
|---|---|
| LPUSH key value1 [value2] | 将一个或多个值,从队列的左边插入进去 |
| LRANGE key start stop | 获取列表指定范围内的元素。start和stop是索引值(从0开始的,0表示第1个) |
| RPOP key | 移除并获取列表最后一个元素 |
| LLEN key | 获取列表长度 |
| BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素; 如果列表没有元素将会阻塞列表,直到等待超时或发现可弹出元素为止 |
操作 :
127.0.0.1:6379> lpush name tom jack luck mark
(integer) 4
127.0.0.1:6379> lrange name 0 -1 #从name对应的列表里,查询索引0到最后的数据(包含头和尾)
1) "mark"
2) "luck"
3) "jack"
4) "tom"
127.0.0.1:6379> rpop name
"tom"
127.0.0.1:6379> lrange name 0 -1
1) "mark"
2) "luck"
3) "jack"
127.0.0.1:6379> llen name
(integer) 3
127.0.0.1:6379> brpop name 5 #移除并获取列表的最后一个元素
1) "name"
2) "jack"
127.0.0.1:6379> rpop name
"luck"
127.0.0.1:6379> rpop name
"mark"
127.0.0.1:6379> rpop name
(nil)
127.0.0.1:6379> brpop name 5 # 如果列表没有元素将会阻塞列表,直到等待超时或发现可弹出元素为止
(nil)
(5.04s)
4.集合操作命令
| 命令 | 说明 |
|---|---|
| SADD key member1 [member2] | 向集合添加一个或多个成员 |
| SMEMBERS key | 返回集合中的所有成员 |
| SCARD key | 获取集合的成员数 |
| SINTER key1 [key2] | 返回给定所有集合的交集 |
| SUNION key1 [key2] | 返回所有给定集合的并集 |
| SREM key member1 [member2] | 移除集合中一个或多个成员 |
操作 :
127.0.0.1:6379> sadd name tom jack mark lucy
(integer) 4
127.0.0.1:6379> smembers name
1) "lucy"
2) "tom"
3) "mark"
4) "jack"
127.0.0.1:6379> scard name
(integer) 4
127.0.0.1:6379> sadd name1 tom jack tony zero
(integer) 4
127.0.0.1:6379> sinter name name1
1) "tom"
2) "jack"
127.0.0.1:6379> sunion name name1
1) "tony"
2) "jack"
3) "lucy"
4) "tom"
5) "zero"
6) "mark"
127.0.0.1:6379> srem name mark
(integer) 1
127.0.0.1:6379> smembers name
1) "lucy"
2) "tom"
3) "jack"
5.有序集合操作命令
| 命令 | 说明 |
|---|---|
| ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员 |
| ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合中指定区间内的成员 |
| ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
| ZREM key member [member ...] | 移除有序集合中的一个或多个成员 |
操作 :
127.0.0.1:6379> zadd myzset 30 zhangsan 40 lisi 50 wangwu 60 zhaoliu 70 qianqi #向key为myzset的有序集合里添加成员
(integer) 5
127.0.0.1:6379> zrank myzset lisi #从myzset里查询lisi的名次(从0开始的)
(integer) 1
127.0.0.1:6379> zrank myzset zhangsan #从myzset里查询zhangsan的名次(从0开始的)
(integer) 0
127.0.0.1:6379> zscore myzset zhangsan #从myzset里查询zhangsan的分值
"30"
127.0.0.1:6379> zrange myzset 0 2 #从myzset里从索引0(排名0)查询到索引2(排名2)的成员,包含头尾
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zrange myzset 0 2 withscores #从myzset里从索引0(排名0)查询到索引2(排名2)成员及分值,包含头尾,
1) "zhangsan"
2) "30"
3) "lisi"
4) "40"
5) "wangwu"
6) "50"
127.0.0.1:6379> zrange myzset 0 -1 withscores #从myzset里从索引0(排名0)查询到索最后1个 成员及分值,包含头尾,
1) "zhangsan"
2) "30"
3) "lisi"
4) "40"
5) "wangwu"
6) "50"
7) "zhaoliu"
8) "60"
9) "qianqi"
10) "70"
127.0.0.1:6379> zincrby myzset 100 zhangsan #给myzset里zhangsan成员的分值,增加上100
"130"
127.0.0.1:6379> zrange myzset 0 -1 withscores #查询所有成员及分值,发现zhangsan的分值和排名已经变了
1) "lisi"
2) "40"
3) "wangwu"
4) "50"
5) "zhaoliu"
6) "60"
7) "qianqi"
8) "70"
9) "zhangsan"
10) "130"
127.0.0.1:6379> zincrby myzset -100 zhangsan #给myzset里zhangsan成员的分值,增加上-100
"30"
127.0.0.1:6379> zrem myzset zhangsan #从myzset里删除掉zhangsan成员
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 #再查询所有成员,发现zhangsan已经被删除掉了
1) "lisi"
2) "wangwu"
3) "zhaoliu"
4) "qianqi"
127.0.0.1:6379>
6.通用命令
| 命令 | 说明 |
|---|---|
| KEYS pattern | 查找所有符合给定模式( pattern)的 key |
| EXISTS key | 检查给定 key 是否存在 |
| TYPE key | 返回 key 所储存的值的类型 |
| DEL key | 该命令用于在 key 存在是删除 key |
操作 :
127.0.0.1:6379> keys *
1) "name"
2) "name1"
3) "verify_code"
4) "stu"
127.0.0.1:6379> keys na*
1) "name"
2) "name1"
127.0.0.1:6379> keys name?
1) "name1"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists aaa
(integer) 0
127.0.0.1:6379> type name
set
127.0.0.1:6379> del name1
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "verify_code"
3) "stu"