传统关系数据库的瓶颈
- 在互联网领域,MysqL成为了绝对的王者,毫不夸张的说,MysqL为互联网的发展做出了卓越的贡献。大部分的MysqL都应该是IO密集型的,大数据量高并发环境下的MysqL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。MysqL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MysqL省去,MysqL将变得非常的小
- 关系数据库很强大,但是它并不能很好的应付所有的应用场景。MysqL的扩展性差,大数据下IO压力大,表结构更改困难
NOsql的优势
- 易扩展:Nosql数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展
- 大数据量,高性能:Nosql数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单
- 灵活的数据模型:Nosql无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦
- 高可用:Nosql在不太影响性能的情况,就可以方便的实现高可用的架构
Redis
-
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
-
redis是一个高性能的key-value存储系统。它支持存储的value类型,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便
-
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助
配置
- 绑定ip:如果需要远程访问,可将此行注释,或绑定一个真实ip
bind 127.0.0.1
- 端口,默认为6379
port 6379
- 是否以守护进程运行
- 如果以守护进程运行,则不会在命令行阻塞,类似于服务
- 如果以非守护进程运行,则当前终端被阻塞
- 设置为yes表示守护进程,设置为no表示非守护进程
- 推荐设置为yes
daemonize yes
- 数据文件
dbfilename dump.rdb
- 数据文件存储路径
dir /var/lib/redis
- 日志文件
logfile /var/log/redis/redis-server.log
database 16
客户端
- 客户端的命令为redis-cli
- 可以使用help查看帮助文档
redis-cli --help
- 运行测试命令
ping
select 1
string
增加、修改
set key value
- 设置键值及过期时间,以秒为单位
setex key seconds value
- 例2:设置键为'py2'值为'hr'过期时间为3秒的数据
setex 'py2' 3 'hr'
- 设置多个键值
mset key1 value1 key2 value2 ...
- 例3:设置键为'py3'值为'dx'、键为'py4'值为'xd'、键为'py5'值为'nd'、键为'py6'值为'bg'的数据
mset 'py3' 'dx' 'py4' 'xd' 'py5' 'nd' 'py6' 'bg'
- 追加值
append key value
- 例4:向键为py1中追加值' haha'
append 'py1' ' haha'
获取
get key
- 例5:获取键'py1'的值
get 'py1'
- 根据多个键获取多个值
mget key1 key2 ...
- 例6:获取键'py3'、'py4'、'py5'、'py6'的值
mget 'py3' 'py4' 'py5' 'py6'
键命令
- 查找键,参数支持正则表达式
keys pattern
- 例1:查看所有键
keys *
- 例2:查看名称中包含a的键
keys '*a*'
- 判断键是否存在,如果存在返回1,不存在返回0
exists key1
- 例3:判断键'py1'、'py2'是否存在
exists 'py1'
exists 'py2'
- 查看键对应的value的类型
type key
type 'py1'
- 删除键及对应的值
del key1 key2 ...
- 例5:删除键'py3'、'py4'、'py5'、'py6'
del 'py3' 'py4' 'py5' 'py6'
hash
- hash用于存储对象,对象的结构为属性、值
- 值的类型为string
增加、修改
- 设置单个属性
hset key field value
- 例1:设置键'py2'的属性'name'为'hr'
hset 'py2' 'name' 'hr'
- 设置多个属性
hmset key field1 value1 field2 value2 ...
hmset 'py3' 'name' 'dx' 'gender' '1' 'birthday' '2017-1-1'
获取
hkeys key
hkeys 'py3'
hget key field
hget 'py2' 'name'
hmget key field1 field2 ...
hmget 'py3' 'name' 'gender' 'birthday'
hvals key
hvals 'py3'
删除
hdel key field1 field2 ...
hdel 'py3' 'gender' 'birthday'
list
- 列表的元素类型为string
- 按照插入顺序排序
增加
- 在左侧插入数据
lpush key value1 value2 ...
- 例1:从键为'py11'的列表左侧加入数据'dx'、'xd'
lpush 'py11' 'dx' 'xd'
- 在右侧插入数据
rpush key value1 value2 ...
- 例2:从键为'py11'的列表右侧加入数据'nd'、'bg'
rpush 'py11' 'nd' 'bg'
- 在指定元素的前或后插入新元素
linsert key before或after 现有元素 新元素
- 例3:在键为'py11'的列表中元素'nd'前加入'zbt'
linsert 'py11' before 'nd' 'zbt'
@H_344_502@获取
lrange key start stop
- 例4:获取键为'py11'的列表所有元素
lrange 'py11' 0 -1
修改
lset key index value
- 例5:修改键为'py11'的列表中下标为1的元素值为'xidu'
lset 'py11' 1 'xidu'
删除
- 删除指定元素
- 将列表中前count次出现的值为value的元素移除
- count > 0: 从头往尾移除
- count < 0: 从尾往头移除
- count = 0: 移除所有
lrem key count value
- 例6.1:向列表'py12'中加入元素'h0'、'h1'、'h2'、'h0'、'h1'、'h3'、'h0'、'h1'
rpush list3 'h0' 'h1' 'h2' 'h0' 'h1' 'h3' 'h0' 'h1'
- 例6.2:从'py12'列表右侧开始删除2个'h0'
lrem 'py12' -2 'h0'
set
- 无序集合
- 元素为string类型
- 元素具有唯一性,不重复
- 说明:对于集合没有修改操作
zset
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。