一.NoSQL
关系型数据库的强大是毋庸置疑的,但关系型数据库的速度,尤其是对于大量数据的插入,较为耗时,只是我们可以了解一波NoSQL。在Web2.0时代,尤其重要
对于非关系型数据库而言,主流的NoSQL产品mongoDB,Redis都是很不错的起手选择。
了Redis前,先了解一下NoSQL
NoSQL数据库主要有四大分类:
1.键值存储数据库
典型应用:内容缓存,主要用于处理大量数据的高访问负载
数据模型:键值对
特点:查询速度快,但是数据的存储缺少结构化
2 、列存储数据库
典型应用:分布式文件系统
数据模型:列簇式存储
特点:查找速度快,可扩展性强,就是功能相对局限
3.文档型数据库
典型应用:Web应用
数据模型:一系列键值对
特点:对数据结构要求不严格,但是查询性能不高,也没有一个统一的查询语法
4.图形数据库:
典型应用:社交网络
数据结构:图结构
特点:可以利用图结构相算法,不过要对整个图进行计算,不好做一个分布式的集群方案
NoSQL的主要优势:
1.易扩展--->NoSQL数据库相对于关系型数据库,缺少了关系型数据库的关系型特性,数据之间无关系,就较易进行扩展
2.大数据量,高性能---->读写性能很高,在大数据量下,读写性能依旧很高
3.数据模式灵活---->无需事先为存储数据建立字段,随时可以存储自定义的数据格式吗,大数据量的表里添加字段依旧很轻松
4.高可用--->在不太影响性能的情况下,就可以很方便的实现高可用的架构
二、Redis
2.1
Redis简介:C语言开发的开源高性能键值对数据库,支持5种类型
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
redis的应用主要应用在缓存上,聊天室好友列表,排行榜等应用上也有较多的应用
2.2
对于安装,网上有较多的安装教程,我们根据其安装即可。在安装时我们注意要先安装gcc。在相关文件拷贝至/usr/local/redis/bin目录下,bin目录下,执行./redis-server redis.conf命令启动redis,./redis-cli打开,在6379端口下可以执行相关命令。在windows下也有对应的redis安装文件,但是所谓的windows下,也就是用了类似于Linux模拟器的东西,在其客户端页面,一些linux命令也能够执行
2.3
redis的set存储数据,get获取数据,较为简单,对于五种数据的相应操作,我们以下呈现
2.3.1.String类型
127.0.0.1:6379> set zhangsan a ---->set用于存储
OK
127.0.0.1:6379> get zhangsan ----->get获取
"a"
127.0.0.1:6379> get lisi ------>nil为空
(nil)
127.0.0.1:6379> del zhangsan ------->del 根据键删除
(integer) 1
127.0.0.1:6379> incr num -------->对键的值进行++,键不存在,值设为0,创建键,在++
(integer) 1
127.0.0.1:6379> decr num -------->键值--
(integer) 0
127.0.0.1:6379> incrby num 5 -------->num+5
(integer) 5
127.0.0.1:6379> decrby num 5 ---------->num-5
(integer) 0
127.0.0.1:6379> append num 123 ------------>追加字符串
(integer) 4
127.0.0.1:6379> get num
"0123"
2.3.2储存hash
127.0.0.1:6379> hset myhash username zhangsan ---------->在键myhash中存入一个hashmap
(integer) 1
127.0.0.1:6379> hmset myhash username lisi age 21 ------>在键myhash中存入多个hashmap
OK
127.0.0.1:6379> hget myhash username --------->获取键username的值
"lisi"
127.0.0.1:6379> hmget myhash username age ---------->获取多个键的值
1) "lisi"
2) "21"
127.0.0.1:6379> hgetall myhash --------->得到键myhash中所有的键和值
1) "name"
2) "tom"
3) "age"
4) "21"
5) "addr"
6) "beijing"
7) "username"
8) "lisi"
127.0.0.1:6379> hdel myhash addr age ----------->删除addr和age的键和值
(integer) 2
127.0.0.1:6379> hmset myhash username zhangsan
OK
127.0.0.1:6379> del myhash2 ----------->删除键myhash2和myhash2中的数据
(integer) 0
127.0.0.1:6379> hget myhash age
(nil)
127.0.0.1:6379> hset myhash age 2
(integer) 1
127.0.0.1:6379> hincrby myhash age 5 ---------->age+5
(integer) 7
127.0.0.1:6379> hexists myhash username -------->键username在键myhash中是否存在
(integer) 1
127.0.0.1:6379> hexists myhash password ---------->判断怕password是否存在
(integer) 0
127.0.0.1:6379> hlen myhash ---------->myhash中键的个数
(integer) 3
127.0.0.1:6379> hkeys myhash --------->获取所有键
1) "name"
2) "username"
3) "age"
127.0.0.1:6379> hvals myhash --------->获取所有值
1) "tom"
2) "zhangsan"
3) "7"
2.4 存储list
两端添加
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> lpush mylist 1 2 3
(integer) 6
127.0.0.1:6379> rpush mylist2 a b c
(integer) 4
127.0.0.1:6379> rpush mylist2 1 2 3 (integer) 7
查看列表
127.0.0.1:6379> lrange mylist 0 5
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"6) "a"
两端弹出
127.0.0.1:6379> lpop mylist
"3"
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "1"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpop mylist2
"3"
127.0.0.1:6379> lrange mylist2 0 -1
1) "a"
2) "a"
3) "b"
4) "c"
5) "1"
6) "2"
元素个数
127.0.0.1:6379> llen mylist
(integer) 5
lpush仅当key存在时,向list头部插入value,不存在不插入
127.0.0.1:6379> lpushx mylist x
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "x"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lpushx mylist3 x
(integer) 0
初始化
127.0.0.1:6379> lpush mylist 1 2 3
(integer) 9
127.0.0.1:6379> lpush mylist3 1 2 3
(integer) 3
127.0.0.1:6379> lpush mylist3 1 2 3
(integer) 6
127.0.0.1:6379> lpush mylist3 1 2 3
(integer) 9
127.0.0.1:6379> lrange mylist3 0 -1
1) "3"
2) "2"
3) "1"
4) "3"
5) "2"
6) "1"
7) "3"
8) "2"9) "1"
从头删除2 个3
127.0.0.1:6379> lrem mylist3 2 3
(integer) 2
127.0.0.1:6379> lrange mylist3 0 -1
1) "2"
2) "1"
3) "2"
4) "1"
5) "3"
6) "2"
7) "1"
从尾删除2个1
127.0.0.1:6379> lrem mylist3 -2 1
(integer) 2
127.0.0.1:6379> lrange mylist3 0 -1
1) "2"
2) "1"
3) "2"
4) "3"
5) "2"
删除所有的2
127.0.0.1:6379> lrem mylist3 0 2
(integer) 3
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "3"
linsert key before 123 12在123之前插入1
rpoplpush resource destination将链表中的尾部元素弹出并添加到头部
127.0.0.1:6379> lset mylist3 1 123
OK
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "123"
127.0.0.1:6379> linsert mylist before 123 12
(integer) 10
127.0.0.1:6379> linsert mylist3 before 123 12
(integer) 3
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "12"
3) "123"
127.0.0.1:6379> linsert mylist2 after 123 3
(integer) -1
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "12"
3) "123"127.0.0.1:6379> lpush mylist5 1 2 3
(integer) 3
127.0.0.1:6379> lpush mylist6 a b c
(integer) 3
127.0.0.1:6379> rpoplpush mylist5 mylist6
"1"
127.0.0.1:6379> rpoplpush mylist6 mylist6
"a"
127.0.0.1:6379> lrange mylist6 0 -1
1) "a"
2) "1"
3) "c"4) "b"
2.5存储set
set可以看做没有排序的字符集合。set不允许出现重复的元素,多次添加同一元素,只保留一份拷贝
添加/删除元素
127.0.0.1:6379> sadd myset a b c
(integer) 2
127.0.0.1:6379> sadd myset a
(integer) 0
127.0.0.1:6379> srem myset a b
(integer) 2
获得集合中元素
127.0.0.1:6379> smembers myset
1) "7"
2) "5"
3) "8"
4) "6"
5) "2"
6) "c"
7) "1"
8) "9"
9) "3"10) "4"
判断参数是否存在
127.0.0.1:6379> sismember myset a
(integer) 0
集合差集运算
127.0.0.1:6379> sadd mya1 a b c
(integer) 3
127.0.0.1:6379> sadd myb1 a c 1 2
(integer) 4
127.0.0.1:6379> sdiff mya1 myb11) "b"
集合交集运算
127.0.0.1:6379> sadd mya2 a b c
(integer) 3
127.0.0.1:6379> sadd myb2 a c 1 2
(integer) 4
127.0.0.1:6379> sinter mya2 myb2
1) "c"2) "a"
集合并集运算
127.0.0.1:6379> sadd mya3 a b c
(integer) 3
127.0.0.1:6379> sadd myb3 a c 1 2
(integer) 4
127.0.0.1:6379> sunion mya3 myb3
1) "b"
2) "c"
3) "2"
4) "a"
5) "1"
scard key 获取集合中成员数量
127.0.0.1:6379> scard myset
(integer) 10
strandmember key随机获取一个
127.0.0.1:6379> srandmember myset
"4"
sdiff 查看差集,diffstore将差集存入
127.0.0.1:6379> sdiff mya1 myb1
1) "b"
127.0.0.1:6379> sdiffstore my1 mya1 myb1
(integer) 1
127.0.0.1:6379> smembers my1
1) "b"
sinter查看交集,sinterstore将交集存入
127.0.0.1:6379> sinter mya1 myb1
1) "c"
2) "a"
127.0.0.1:6379> sinterstore my2 mya1 myb1
(integer) 2
127.0.0.1:6379> smembers my2
1) "c"
2) "a"
sunionter destination ,将交集存入destination
127.0.0.1:6379> sunion mya1 myb1
1) "b"
2) "c"
3) "2"
4) "a"
5) "1"
127.0.0.1:6379> sunionstore my3 mya1 myb1
(integer) 5
127.0.0.1:6379> smembers my3
1) "b"
2) "c"
3) "2"
4) "a"5) "1"
2.6存储sortedset
Sorted-Set和set类型及其相似,主要差别是sorted-set中的每一个成员都有一个权重,来对其进行排序、
添加元素
127.0.0.1:6379> zadd sort1 70 zhangsan 80 wangwu 90 lisi
(integer) 3
获取权重
127.0.0.1:6379> zscore sort1 zhangsan
"70"
获取元素个数
127.0.0.1:6379> zcard sort1
(integer) 3
移除元素
127.0.0.1:6379> zrem sort1 lisi
(integer) 1
127.0.0.1:6379> zcard sort1
(integer) 2
范围查询
127.0.0.1:6379> zrange sort1 0 -1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zrevrange sort1 0 -1 按分数从大到小排序
1) "wangwu"
2) "zhangsan"
127.0.0.1:6379> zremrangebyrank sort1 0 4 按排名范围删除
(integer) 2
127.0.0.1:6379> zremrangebyscore sort1 80 100 按分数范围删除
(integer) 0
zrangebyscore key min max [withscores] [limit offset count]:返回分数在【min,max】的成员并按照分数从低到高排序,
127.0.0.1:6379> zrangebyscore sort1 0 100 withscores
1) "zhou"
2) "70"
3) "wu"4) "80"
zincrby key increment member :设置指定成员增加的分数
127.0.0.1:6379> zincrby sort1 3 wu
"83"
zcount key min max 获取分数在【min,max】之间的成员
zrank返回排名(从小到大)
127.0.0.1:6379> zcount sort1 70 80
(integer) 1
127.0.0.1:6379> zrank mysort wu(integer) 2
zrevrank返回排名,(从大到小)
127.0.0.1:6379> zrangebyscore sort1 0 100 withscores
1) "lisi"
2) "3"
3) "zhou"
4) "70"
127.0.0.1:6379> zrevrank sort1 zhou
(integer) 1
对与五种数据类型的基本操作,我们今天暂时交流到这里,明天在接着介绍