Linux day10
NoSQL no only sql
简介
在过去几年,关系型数据库一直是数据持久化的唯一选择,数据工作者考虑的也只是在这些传统数据库中做筛选,比如SQL Server、Oracle或者是MySQL。甚至是做一些默认的选择,比如使用.NET的一般会选择SQL Server;使用Java的可能会偏向Oracle,Ruby是MySQL,Python则是PostgreSQL或MySQL等等。
原因很简单:过去很长一段时间内,关系数据库的健壮性已经在多数应用程序中得到证实。我们可以使用这些传统数据库良好的控制并发操作、事务等等。然而如果传统的关系型数据库一直这么可靠,那么还有NoSQL什么事?NoSQL之所以生存并得到发展,是因为它做到了传统关系型数据库做不到的事!
为什么nosql会发展的这么好那?
关键原因是:传统关系型数据库遇到了性能瓶颈。
- High performance - 对数据库高并发读写的需求
- Huge Storage - 对海量数据的高效率存储和访问的需求
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
redis
热点数据:经常被使用的数据,存储在内存中。
安装redis:
方式一:
yum安装,先配置epel-*
yum install -y redis
方式二编译安装:
cd /opt
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xf redis-5.0.5
ll
cd /redis-5.0.5
cat Readme
make
yum install -y tcl
安装成功
redis可执行文件
./src/redis- # 按tab
redis-check-aof #用于修复出问题的AOF文件
redis-sentinel #用于集群管理
redis-check-rdb #用于修复出问题的dump.rdb文件
redis-server #redis的服务端
redis-benchmark #性能测试
redis-cli #redis的客户端
redis-trib.rb #集群管理
启动
[root@localhost redis-5.0.5]#./src/redis-server
# 查看端口:
ss -tnlp 6379
性能测试
# 默认是100000个,50个客户端同时发起连接
[root@localhost redis-5.0.5]#./src/redis-benchmark -q
PING_INLINE: 29682.40 requests per second
PING_BULK: 29568.30 requests per second
SET: 29120.56 requests per second
GET: 32175.03 requests per second
INCR: 30969.34 requests per second
LPUSH: 29334.12 requests per second
RPUSH: 30404.38 requests per second
LPOP: 32351.99 requests per second
RPOP: 30998.14 requests per second
SADD: 31847.13 requests per second
HSET: 32258.07 requests per second
SPOP: 31938.68 requests per second
LPUSH (needed to benchmark LRANGE): 32414.91 requests per second
LRANGE_100 (first 100 elements): 13336.89 requests per second
LRANGE_300 (first 300 elements): 5937.54 requests per second
LRANGE_500 (first 450 elements): 4234.06 requests per second
LRANGE_600 (first 600 elements): 3434.77 requests per second
MSET (10 keys): 30084.24 requests per second
连接
[root@localhost redis-5.0.5]#./src/redis-cli -h
-h # ip地址
-p # 端口 6379
-s # 套接字
-a # 密码
-n # 数据库数量 ./src/redis-cli -n 2 # 指定redis的库
redis数据类型
- string:字符串
- hash:哈希
- list:列表
- set:集合
- zset:有序集合
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
string | 二进制安全 | 可以包含任何数据,比如jpg图片(二进制)或者序列化的对象,一个键最大能存储512M | |
Hash(字典) | 键值对集合 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值 | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删查,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
命令相关
命令不区分大小写
[root@localhost redis-5.0.5]#./src/redis-cli
127.0.0.1:6379> ping # ping测试redis是否连接通,返回值是PONG
PONG
127.0.0.1:6379> info # info 获取系统全部信息
127.0.0.1:6379> INFO cpu # INFO 获取cpu信息
# CPU
used_cpu_sys:83.807114
used_cpu_user:121.747879
used_cpu_sys_children:0.046584
used_cpu_user_children:0.040134
127.0.0.1:6379> ECHO anwen # ECHO 打印内容
"anwen"
127.0.0.1:6379> quit # quit 退出
# redis分为16个库,从0-15
127.0.0.1:6379> select 1 # select 切换redis的库 1
127.0.0.1:6379> set anwen 123
127.0.0.1:6379> get anwen
127.0.0.1:6379> select 2 # select 切换redis的库 1
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> set anwen aaa
OK
127.0.0.1:6379[1]> get anwen
"aaa"
127.0.0.1:6379[1]> del anwen # 删除一个或者多个key,不存在的key会忽略
(integer) 1
127.0.0.1:6379[1]> EXISTS anwen # 判断key是否存在,存在为1 不存在为0
(integer) 0
127.0.0.1:6379> EXPIRE anwen 3 # 设置存活时间活3秒 EXPIRE+key+seconds
(integer) 0
127.0.0.1:6379> get anwen # EXPIRE 过期以后自动删除
(nil)
127.0.0.1:6379> set anwen 123
OK
127.0.0.1:6379> EXPIRE anwen 5
(integer) 1
127.0.0.1:6379> ttl anwen # 查看key的存活时间;-2key不存在,-1永久生效;
(integer) 1
127.0.0.1:6379> ttl anwen
(integer) -2
127.0.0.1:6379> KEYS * # 查找所有符合的规则,支持通配符
1) "mylist"
2) "anwen"
3) "key:__rand_int__"
4) "counter:__rand_int__"
5) "myset:__rand_int__"
127.0.0.1:6379> keys a*
1) "anwen"
127.0.0.1:6379> keys a????
1) "anwen"
127.0.0.1:6379> move anwen 1 # move+key+db 移动当前的key 到指定的db里面,成功返回1,失败返回0
(integer) 1
127.0.0.1:6379> get anwen
(nil)
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> get anwen
"123"
127.0.0.1:6379[1]> PEXPIRE anwen 10000 pexpire key # 给一个key设置过期时间
(integer) 1
127.0.0.1:6379[1]> pttl anwen # pttl 查看key存活时间 单位是毫秒
(integer) 2065
127.0.0.1:6379[1]> pttl anwen
(integer) -2
127.0.0.1:6379[1]> RANDOMKEY # RANDOMKEY随机获取一个key,不删除;如果数据库为空则返回空
"anwen"
127.0.0.1:6379[1]> RANDOMKEY
"yage"
127.0.0.1:6379[1]> RENAME anwen aw # RENAME重命名,如果源key不存在,则报错,如果目标key存在,则覆盖
OK
127.0.0.1:6379[1]> keys *
1) "yage"
2) "aw"
127.0.0.1:6379[1]> RENAME anwen anwen
(error) ERR no such key
127.0.0.1:6379[1]> RENAMENX anwen aw #重命名key,如果源key不存在,则报错,如果目标key存在,则不变
127.0.0.1:6379[1]> TYPE anwen # TYPE 查看key所存储的数据类型;如果没有key则返回none
string
127.0.0.1:6379[1]> LPUSH anwenlist 1 2
(integer) 2
127.0.0.1:6379[1]> TYPE anwenlist
list
127.0.0.1:6379[1]> type aaa
none
string
set # 设置key - value,如果key存在则覆盖,不存在则新建
set key1 v1 EX 5 # ex + seconds 设置key的存活时间
set key value px 10000 # px + 毫秒 设置key的存活时间
set key value NX # nx 如果键不存在则新建 如果键存在则返回nil
set key value xx # xx 只有键存在才能操作,可以改值
mset # 批量创建key - value对应关系
mset k1 v1 k2 v2 k3 v3
mset k1 vv1 k2 vv2 #key存在则覆盖
get # 获取key对应的value,只能获取一个,如果key存在则返回值,如果key不存在则nil
mget k1 k2 k3 k4 # 批量获取key
getset k1 v1 # 给指定的key设置新value,并返回原来的旧value,如果key不存在则返回nil
strlen anwen # 返回key对应的value的长度
append anwen 123 # 如果key存在则追加,如果key不存在则新建
incr anwen # 将key中存在的value 加1,只能对数字有效
incrby anwen 10 # 将key中存在的value 加10 指定加的值
incrbyfloat anwen 1.2 # 将key中存在的value 加指定的浮点值
incrbyfloat anwen -1.2 # 减
incrbyfloat anwen 1.000000000 # 不保留.0 默认保留17位
decr anwen # 将key中存在的value 减1,只能对数字有效
decrby anwen 5 # 将key中存在的value 减5 指定减的值
getrange anwen 1 3 # 切片 同Python类似,不能使用步长
list
lpush anwenlist 123 234 345 # 将一个或者多个value插入列表头部
lrange anwenlist 0 -1 # 查看列表指定元素 查看全部 0 -1
lpop anwenlist # 删除并返回列表key的头一个元素,先进后出
rpush anwenlist 456 # 将一个或者多个value插入列表尾部(最后边),
rpop anwenlist # 删除尾部的value
rpushx # 将value插入到key的尾部,key必须存在才可以
lpushx # 将value插入到key的头部,key必须存在才可以
lindex anwen 2 # 从表头开始,获取下标为index的value
linsert anwen before 234 999 # 将value插入key指定的元素前或者后,如果value不存在则不操作
linsert anwen after 234 999
llen # 获取列表长度
lrem anwen # 删除列表中的value,count>0 从表头往表尾方向查找删除;count=0 全部删除;count<0 从表尾往表头方向查找,删除指定个数
lset anwen 3 aaaa # 替换指定的索引位置的value,如果索引超出范围则报错
ltrim anwen 1 3 # 列表的切片,超出为空
hash
{'db':{'redis':"redis.conf",'mysql':'mysql.conf','nginx':'nginx.conf'}}
hset bd redis redis.conf #给hash增加key value
hset bd mysql mysql.conf
hset bd nginx nginx.conf
hlen bd h # 获取hash长度
hget bd mysql # 获取key的value
hgetall db # 获取所有的键值对
hmset ac 1 2 2 3 3 4 4 5 # 批量增加键值对
hlen ac
hmget ac 1 3 # 批量获取键值对
1) "2"
2) "4"
hsetnx ac 1 5 # 给指定的hash增加键值对,如果原来的键存在则操作无效,如果不存在则新增
hsetnx
hkeys ac # 获取hash表中所有的键
hvals db # 获取hash表中所有的value
hdel db redis # 删除hash表中的一个或者多个key-value
hkeys db
hexists db mysql # 判断hash表中的键是否存在,如果存在则为1,不存在则为0
hincrby # 给hash表中的键增加指定的数值,仅限数字
hincrbyfloat # 给hash表中的键增加指定的浮点值,仅限数字
set
sadd s22 dazhuagn dazhuang dazhuagn anwen # sadd给集合添加值,自动去重
smembers s22 # 获取集合所有值成员
scard s22 # 获取集合中成员个数
sadd s23 anwen biaoge
sdiff s22 s23 # 获取两个集合的差集,前面存在但是后面不存在
sinter s22 s23 # 获取两个集合的交集
sunion s22 s23 # 获取两个集合的并集
sismember s22 anwen # 判断元素是否在集合中,如果存在则为1,不存在则为0
smove s22 s23 anwen # 将指定的元素从一个集合移动到另一个集合,如果原集合存在则移动,如果不存在则忽略;如果目标集合存在则直接移动,如果目标不存在则新建集合并移动
spop s22 2 # 随机删除指定个数的元素,并打印删除的元素
srandmember s22 2 # 随机获取指定个数的元素,默认随机获取一个
count>0 :
如果count大于集合总数则全取
如果count小于集合总数则随机取指定个数
count<0 :则随机取指定个数
srem s22 anwen # 删除指定的一个或多个元素
zset
zadd 123 1 123
zrange 123