概念
NoSQL:Not Only SQL 不仅仅是 SQL,通常指的是非关系型的数据库(没有表与表之间的关联关系),向mysql、oracle都属于关系型数据库。
有点
格式灵活:存储数据格式是key=value格式,value的格式可以是文档形式、图片形式等等。速度快:非关系型数据库能够使用硬盘或者内存作为载体,而关系型数据库只能使用硬盘作为载体。成本低:非关系型数据库部署简单,基本都是开源免费的。缺点
不提供sql支持,学习和使用成本较高。数据结构相对复杂,导致复杂查询不方便。数据高并发
在同一个时间点有海量的用户并发访问,导致IO次数过多造成关系型数据库的瘫痪。
海量数据的存储
类似QQ,微信,微博,每天用户产生海量的用户动态,每天产生几千万条记录。对于关系数据库来说,在一张几亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
高扩展性和高可用性的需求
关系型数据库进行扩展和升级是比较麻烦的一样事,对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
非关系型数据库可以通过不断的添加服务器节点来实现扩展,而不需对原有的数据库进行维护。
概念
Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征
数据间没有必然的关联关系。内部采用单线程机制进行工作,保证了数据的原子性。高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。多数据类型的支持 字符串类型:String列表类型:List散列类型:hash集合类型:set redis支持持久化,可以进行数据灾难恢复。下载
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
解压
tar –xvf redis-5.0.0.tar.gz
下载编译软件(因为redis是基于c++开发的)
yum -y install gcc-c++
编译(在解压的目录中执行)
make
安装(在解压的目录中执行)
make install
启动服务器——指定端口号启动
redis-server [--port port]
redis-server --port 6379
启动服务器——以指定的配置文件启动
redis-server config_file_name
redis-server redis.conf
启动客户端
redis-cli [-h host] [-p port]
redis-cli –h 61.129.65.248 –p 6384
设置服务器以守护进程的方式运行,开启后服务器控制台中将打印服务器运行信息(同日志内容相同)
daemonize yes|no
绑定主机地址(限定的是本机连接时的ip)
bind ip
设置服务器端口号
port port
设置服务器文件保存地址
dir path
服务器允许客户端连接最大数量,默认0,表示无限制。当客户端连接到达上限后,Redis会拒绝新的连接
maxclients count
客户端闲置等待最大时长,达到最大值后关闭对应连接。如需关闭该功能,设置为 0
timeout seconds
设置服务器以指定日志记录级别
loglevel debug|verbose|notice|warning
注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度
日志记录文件名
logfile filename
设置 key,value 数据
set key value
set name zs
根据key,获取相应的value
get key
get name
获取命令帮助文档
help [command]
help set
获取组中所有命令信息名称
help [@group-name]
help @string
redis自身是一个Map,其中所有的数据都是采用key : value的形式存储。
数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型。
存储数据的格式:一个存储空间保存一个数据。
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用。
添加/修改数据
set key value
添加/修改多个数据 mset key1 value1 key2 value2...
获取数据
get key
获取多个数据
get key1 key2...
获取数据字符个数(字符串的长度)
strlen key
追加数据到原始数据后(如果原始信息存在就追加,否则新建)
append key value
删除数据 del key
判定性添加数据(key不存在则添加,已存在则不添加)
setnx key value
hash类型:底层使用哈希表结构实现数据存储。
hash存储结构优化
如果field数量较少,存储结构优化为类数组结构如果field数量较多,存储结构使用HashMap结构添加/修改数据
hset key field value
添加/修改多个数据
hmset key field1 value1 field2 value2 …
获取数据
hget key field -> 根据key和field获取对应的value
hgetall key -> 根据key获取所有的field
获取多个数据
hget key field1 field2...
获取哈希表中支付按的数量
hlen key
删除数据
hdel key field1 [field2]...
根据field设置对应的value,如果field存在,则不做操作,如果不存在就是添加数据
hsetnx key field value
获取哈希表中所有的字段名或字段值
hkey key
hvals key
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。
需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
list类型:保存多个数据,底层使用双向链表存储结构实现
添加/修改数据
lpush key value1 [value2]...
rpush key value1 [value2]...
说明:l r 分别代表left 与 right,表示从队列的左边添加数据,还是右边添加数据。
获取数据
lrange key start stop -> 获取指定索引范围的数据,如果获取全部,索引范围的取值为 0 -1
lindex key index -> 获取指定索引上的数据
llen key -> 获取跟指定的key,获取对应value的长度
获取并移除数据
lpop key 获取并移除list队列最左边的一个数据
rpop key 获取并移除list队列最右边的一个数据。
移除指定数据
lrem key count value -> 指定移除list队列中多少个value
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
添加数据 (menber是成员的意思,跟value是一样的)
sadd key member1 [member2]...
获取全部数据
smembers key
删除数据
srem key member1 [member2]...
获取集合数据总量
scard key
判断集合中是否包含指定数据 sismenber key menber
随机获取集合中指定数量的数据
srandmenber key [count]
随机获取集合中的某个数据,并将该数据移除集合
spop key [count]
查询key
keys * :查询所有的key,* 匹配任意数量的任意符号 ? 配合一个任意符号
获取key的类型
type key
flushall :清除redis数据库中所有的数据。