redis

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

热点数据:经常被使用的数据,存储在内存中。

官网:https://redis.io/download

安装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

原文地址:https://www.cnblogs.com/an-wen/p/12052410.html