今日内容概要

  • redis 的linux安装和配置
  • redis 的api使用
  • 高级用法之慢查询
  • pipline事务

内容详细

1、redis 的linux安装和配置

# redis 版本选择问题
-最新:7.0
-最稳定版本:6.x
-讲课:5.x
-企业里:3.x,4.x,5.x 6.x(极少数公司在用)
-windows:3.x,5.x # 哪些公司在用
-大部分公司-多多少少都会用到 redis
-99%以上公司项目会用关系型数据库(mysql,postgrasql,oracle,国产数据库:达梦)
-80%公司用redis
-去ioe--->ibm(浪潮,联想) ,oracle(达梦..),emc存储
-通用性东西:网络,数据库,redis,nginx,docker... # 特性
1 速度快:10w ops(每秒10w读写),数据存在内存中,c语言实现
2 持久化:rdb和aof
3 多种数据结构:
五大数据结构
BitMaps位图:布隆过滤器 本质是 字符串
HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串
GEO:地理信息定位 本质是有序集合--》附近5公里的美女
4 支持多种编程语言:基于tcp通信协议,各大编程语言都支持,客户端
5 功能丰富:发布订阅(消息) Lua脚本 事务(pipeline),实现分布式锁---(mysql,redis,zookeeper)
6 简单:源代码几万行,不依赖外部库(源码编译安装---》可执行文件执行)
7 主从复制:主服务器和从服务器,主服务器可以同步到从服务器中
8 高可用和分布式:
2.8版本以后使用redis-sentinel支持高可用
3.0版本以后支持分布式

1.1 下载安装

### 1 连接Linux服务器端
wget http://download.redis.io/releases/redis-5.0.7.tar.gz # 2 解压
tar -xzf redis-5.0.7.tar.gz # 3 建立软连接
ln -s redis-5.0.7 redis
cd redis # 文件和文件夹
-Makefile # make,make install的安装依赖文件
-src # c的源代码
-redis.conf # redis的配置文件,启动的时候使用 # 4 编译---可执行文件
make # 5 安装--》根据config配置---》把可执行文件释放到某个路径,在环境变量中
make install # 在src目录下可以看到
redis-server--->redis服务器
redis-cli---》redis命令行客户端
redis-benchmark---》redis性能测试工具
redis-check-aof--->aof文件修复工具
redis-check-dump---》rdb文件检查工具
redis-sentinel---》sentinel服务器,哨兵 redis作者对windows维护不好,window自己有安装包 # 卸载 ---卸载redis
# 1、查看redis进程;
ps aux|grep redis
# 2、kill掉进程;
kill 进程id
# 3、进入到redis目录
cd /root/s20(安装路径)
# 4、删除redis对应的文件
rm -f /usr/local/redis/bin/redis*
rm -f /usr/local/bin/redis*
# 5、删除对应的文件
rm -rf redis

1.2 三种启动方式

# 只要在环境变量的某个路径下,在任意位置敲,都能找到
默认的 /usr/bin /usr/local/bin # 最简启动, cd 来到redis路径下
./src/redis-server
ps -ef|grep redis # 查看进程
netstat -antpl|grep redis # 查看端口
redis-cli -h ip -p port ping # 命令查看
redis-cli -h 127.0.0.1 -p 6379 # 动态参数启动
redis-serve --port 6380 #启动,监听6380端口 # 常用:配置文件启动---》100来对配置文件
# redis 的目录下
vim redis.conf daemonize yes
pidfile /var/run/redis.pid
port 6379
dir "/root/s20/redis/data"
logfile 6379.log # 启动
mkdir data
redis-server ./redis.conf

1.3 客户端连接

# 无密码情况
redis-cli -p 端口 -h 地址 # 有密码情况
redis-cli -h 127.0.0.1 -p 6370 -a 123456 # 查看redis的配置信息
config get port
config get * # 100多对 # 修改配置文件---》有漏洞--》可以利用这个漏洞,提权,以root用户登录到你的redis服务器上
config set maxmemory 128M # 设置最大使用的内存
config set requirepass 123456 # 设置密码,如果没执行下面,在内存中,只要redis服务不重启,就一直生效,但是咱们下写到配置文件中
config REWRITE # 保存到配置文件,重启redis,密码也在 # 进入到链接后,再输密码
redis-cli -p 端口 -h 地址
auth 123456 # 登陆的同时输入密码
redis-cli -h 127.0.0.1 -p 6370 -a 123456

1.4 使用场景

# 缓存系统:使用最广泛的就是缓存--->
做缓存,接口缓存 # 计数器:
网站访问量,转发量,评论数(文章转发,商品销量,不会出现并发问题) # 消息队列:
发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者) # 排行榜:
有序集合(阅读排行,点赞排行,推荐(销量高的,推荐)) 有序集合 # 社交网络:
很多特效跟社交网络匹配,粉丝数,关注数 集合 # 实时系统:
垃圾邮件处理系统,布隆过滤器

2、redis 的api使用

2.1 通用命令

# 衡量算法好坏的指标,大 O 表示法
-空间复杂度(占多大内存),时间复杂(耗费多长时间)
-O(1),O(log n),O(n),O(n方) # 1、keys
打印出所有key
keys * 打印出所有以he开头的key
keys he* 打印出所有以he开头,第三个字母是h到l的范围
keys he[h-l] 三位长度,以he开头,?表示任意一位
keys he? keys命令一般不在生产环境中使用,生产环境key很多,时间复杂度为 o(n),用scan命令 # 2、dbsize 计算key的总数
dbsize # redis内置了计数器,插入删除值该计数器会更改,所以可以在生产环境使用,时间复杂度是o(1) #3、exists key 时间复杂度o(1)
设置a
set a b 查看a是否存在
exists a
(integer) 1
存在返回1 不存在返回0 # 4、del key 时间复杂度o(1)
删除成功返回1,key不存在返回0 # 5、expire key seconds 时间复杂度o(1)
expire name 3 # 3s 过期
ttl name # 查看name还有多长时间过期
persist name # 去掉name的过期时间 # 6、type key 时间复杂度o(1)
type name # 查看name类型,返回string # 7、其他-->系统相关
info 命令:内存,cpu,主从相关--->django写一个redis服务监控--》折线图,饼形图
subprocess---》redis-cli -a 123456 info---》字符串---》 client list 正在连接的会话 client kill ip:端口
client kill 127.0.0.1:40704 dbsize # 总共有多少个key flushall # 清空所有 flushdb # 只清空当前库 16 个库 select 数字 # 选择某个库 总共16个库 默认在第0个 monitor # 记录操作日志,夯住

注意:

# 一个次只会执行一条命令

# 为什么这么快?
1 纯内存
2 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间 # 注意:
1 一次只运行一条命令 2 拒绝长慢命令
-keys,flushall,flushdb,慢的lua脚本,mutil/exec,operate,big value 3 其实不是单线程(在做持久化是另外的线程)

2.2 字符串操作

### 1---基本使用get,set,del
get name # 时间复杂度 o(1)
set name lqz # 时间复杂度 o(1)
del name # 时间复杂度 o(1) ### 2---其他使用incr,decr,incrby,decrby
incr age # 对age这个key的value值自增1
decr age # 对age这个key的value值自减1
incrby age 10 # 对age这个key的value值增加10
decrby age 10 # 对age这个key的value值减10
统计网站访问量(单线程无竞争,天然适合做计数器)
缓存mysql的信息(json格式) ### 3---set,setnx,setxx
set name lqz # 不管key是否存在,都设置
setnx name lqz # key不存在时才设置(新增操作)
set name lqz nx # 同上
set name lqz xx # key存在,才设置(更新操作) ### 4---mget mset
mget key1 key2 key3 # 批量获取key1,key2.。。时间复杂度o(n)
mset key1 value1 key2 value2 key3 value3 # 批量设置时间复杂度o(n) n次get和mget的区别:
n次get时间=n次命令时间+n次网络时间
mget时间=1次网络时间+n次命令时间 ### 5---其他:getset,append,strlen
getset name lqznb # 设置新值并返回旧值 时间复杂度o(1)
append name 666 # 将value追加到旧的value 时间复杂度o(1)
strlen name # 计算字符串长度,字节(注意中文,3个字节) 时间复杂度o(1) ### 6---其他:incrybyfloat,getrange,setrange
increbyfloat age 3.5 # 为age自增3.5,传负值表示自减 时间复杂度o(1)
getrange key start end # 获取字符串制定下标所有的值 时间复杂度o(1)
setrange key index value # 从指定index开始设置value值 时间复杂度o(1)

2.3 哈希hash 类型

# 只支持一层
info {name:lqz,age:19,hobby:字符串} ### 1---hget,hset,hdel
hget key field # 获取hash key对应的field的value 时间复杂度为 o(1)
hset key field value # 设置hash key对应的field的value值 时间复杂度为 o(1)
hdel key field # 删除hash key对应的field的值 时间复杂度为 o(1) # 测试
hset user:1:info age 23
hget user:1:info ag
hset user:1:info name lqz
hgetall user:1:info
hdel user:1:info age ### 2---hexists,hlen
hexists key field # 判断hash key 是否存在field 时间复杂度为 o(1)
hlen key # 获取hash key field的数量 时间复杂度为 o(1)
hexists user:1:info name
hlen user:1:info # 返回数量 ### 3---hmget,hmset
hmget key field1 field2 ...fieldN # 批量获取hash key 的一批field对应的值 时间复杂度是o(n)
hmset key field1 value1 field2 value2 # 批量设置hash key的一批field value 时间复杂度是o(n) ### 4--hgetall,hvals,hkeys
hgetall key # 返回hash key 对应的所有field和value 时间复杂度是o(n)
hvals key # 返回hash key 对应的所有field的value 时间复杂度是o(n)
hkeys key # 返回hash key对应的所有field 时间复杂度是o(n) ### 小心使用 hgetall
## 1 计算网站每个用户主页的访问量
hincrby user:1:info pageview count ## 2 缓存mysql的信息,直接设置hash格式-->
建议用字符串,json形式存 ## 其他操作 hsetnx,hincrby,hincrbyfloat
hsetnx key field value # 设置hash key对应field的value(如果field已存在,则失败),时间复杂度o(1)
hincrby key field intCounter # hash key 对英的field的value自增intCounter 时间复杂度o(1)
hincrbyfloat key field floatCounter # hincrby 浮点数 时间复杂度o(1)

2.4 列表

# 有序队列,可以从左侧添加,右侧添加,可以重复,可以从左右两边弹出

# 插入操作
rpush 从右侧插入
rpush key value1 value2 ...valueN # 时间复杂度为o(1~n)
lpush 从左侧插入 # linsert
linsert key before|after value newValue # 从元素value的前或后插入newValue 时间复杂度o(n) ,需要遍历列表
linsert listkey before b java
linsert listkey after b php # 删除操作
lpop key # 从列表左侧弹出一个item 时间复杂度o(1)
rpop key # 从列表右侧弹出一个item 时间复杂度o(1)
lrem key count value # 根据count值,从列表中删除所有value相同的项 时间复杂度o(n)
1 count>0 从左到右,删除最多count个value相等的项
2 count<0 从右向左,删除最多 Math.abs(count)个value相等的项
3 count=0 删除所有value相等的项
lrem listkey 0 a # 删除列表中所有值a
lrem listkey -1 c # 从右侧删除1个c
ltrim key start end # 按照索引范围修剪列表 o(n)
ltrim listkey 1 4 # 只保留下表1--4的元素 # 查询
lrange key start end # 包含end获取列表指定索引范围所有item o(n)
lrange listkey 0 2
lrange listkey 1 -1 # 获取第一个位置到倒数第一个位置的元素 lindex key index # 获取列表指定索引的item o(n)
lindex listkey 0
lindex listkey -1 llen key #获取列表长度 # 修改
lset key index newValue # 设置列表指定索引值为newValue o(n)
lset listkey 2 ppp # 把第二个位置设为ppp # 其它
blpop key timeout # lpop的阻塞版,timeout是阻塞超时时间,timeout=0为拥有不阻塞 o(1)
brpop key timeout # rpop的阻塞版,timeout是阻塞超时时间,timeout=0为拥有不阻塞 o(1) # 要实现栈的功能:先进后出,后进先出---》吃了吐
lpush+lpop #实现队列功能:先进先出---》吃了拉--》直梯
lpush+rpop #固定大小的列表
lpush+ltrim #消息队列
lpush+brpop

2.5 集合

sadd key element  # 向集合key添加element(如果element存在,添加失败) o(1)

srem key element  # 从集合中的element移除掉 o(1)

scard key  # 计算集合大小

sismember key element  # 判断element是否在集合中  

srandmember key count  # 从集合中随机取出count个元素,不会破坏集合中的元素 (抽奖)

spop key  # 从集合中随机弹出一个元素

smembers key  # 获取集合中所有元素 ,无序,小心使用,会阻塞住 

sdiff user:1:follow user:2:follow  # 计算user:1:follow和user:2:follow的差集

sinter user:1:follow user:2:follow  # 计算user:1:follow和user:2:follow的交集

sunion user:1:follow user:2:follow  # 计算user:1:follow和user:2:follow的并集

sdiff|sinter|suion + store destkey...  # 将差集,交集,并集结果保存在destkey集合中

2.6 有序集合

zadd key score element  # score可以重复,可以多个同时添加,element不能重复 o(logN)
zadd class lyf 100
... zrem key element # 删除元素,可以多个同时删除 o(1) zscore key element # 获取元素的分数 o(1) zincrby key increScore element # 增加或减少元素的分数 o(1) zcard key # 返回元素总个数 o(1) zrank key element # 返回element元素的排名(从小到大排,从0开始) zrange key 0 -1 #返回排名,不带分数 o(log(n)+m) n是元素个数,m是要获取的值 zrange player:rank 0 -1 withscores # 返回排名,带分数 zrangebyscore key minScore maxScore # 返回指定分数范围内的升序元素 o(log(n)+m) n是元素个数,m是要获取的值 zrangebyscore user:1:ranking 90 210 withscores # 获取90分到210分的元素 zcount key minScore maxScore # 返回有序集合内在指定分数范围内的个数 o(log(n)+m) zremrangebyrank key start end # 删除指定排名内的升序元素 o(log(n)+m)
zremrangebyrank user:1:rangking 1 2 # 删除升序排名中1到2的元素 zremrangebyscore key minScore maxScore # 删除指定分数内的升序元素 o(log(n)+m) zremrangebyscore user:1:ranking 90 210 # 删除分数90到210之间的元素 zrevrank # 从高到低排序 zrevrange # 从高到低排序取一定范围 zrevrangebyscore # 返回指定分数范围内的降序元素 zinterstore # 对两个有序集合交集 zunionstore # 对两个有序集合求并集 # 可以写 排行榜---》金币排行,阅读排序,销量排行

客户端

# python --->redis模块

# go---》
https://www.cnblogs.com/liuqingzheng/p/16024070.html

3、高级用法之慢查询

# 通过配置,对慢查询命令的保存,通过命令,取出保存的慢查询命令---》分析

# 两个配置
慢查询是一个先进先出的队列
固定长度
保存在内存中
slowlog-max-len=128
slowly-log-slower-than=10000 # 毫秒,超过这个毫秒的,就会被记录在队列中 # 配置
config set slowlog-log-slower-than 0
config set slowlog-max-len 100
config rewrite # 命令
slowlog get [n] # 查到哪个用户执行的那个命令
slowlog len # 获取慢查询队列长度
slowlog reset # 清空慢查询队列

4、pipline事务

# Redis的 pipeline(管道)功能 在命令行中没有,但 redis是支持 pipeline的,而且在各个语言版的 client中都有相应的实现(客户端又,py-redis,go-redis)

# 将一批命令,批量打包,在redis服务端批量计算(执行),然后把结果批量返回

# 1次pipeline(n条命令) = 1次网络时间 + n次命令时间

# pipeline 期间将 “独占” 链接,此期间将不能进行 非“管道” 类型的其他操作,直到pipeline关闭
如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为 pipeline操作新建 Client链接,让 pipeline和其他正常操作分离在2个client中。
不过pipeline 事实上所能容忍的操作个数,和s ocket-output缓冲区大小/返回结果的数据尺寸都有很大的关系
同时也意味着每个 redis-server同时所能支撑的 pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力 import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
# 创建pipeline
pipe = r.pipeline(transaction=True)
# 开启事务
pipe.multi()
pipe.set('name', 'lqz')
# 其他代码,可能出异常
pipe.set('role', 'nb') pipe.execute() ##### 注意:
pipeline每次只能作用在一个Redis的节点上 集群环境中,用不了pipline ## redis支持事务操作
# 1 mutil 开启事务,放到管道中一次性执行--->管道的使用
multi # 开启事务
set name lqz
set age 18
exec # 2 模拟事务
# 在开启事务之前,先watch,监控age,如果被别人改了,它就改不成功了--》乐观锁
wathc age
multi
decr age
exec # 另一台机器
multi
decr age
exec # 先执行,上面的执行就会失败(乐观锁,被wathc的事务不会执行成功) # 集成到项目中---demo
https://www.cnblogs.com/liuqingzheng/p/9997092.html

redis的Linux系统安装与配置、redis的api使用、高级用法之慢查询、pipline事物的更多相关文章

  1. Redis 01: 非关系型数据库 + 配置Redis

    数据库应用的发展历程 单机数据库时代:一个应用,一个数据库实例 缓存时代:对某些表中的数据访问频繁,则对这些数据设置缓存(此时数据库中总的数据量不是很大) 水平切分时代:将数据库中的表存放到不同数据库 ...

  2. Linux下安装配置Redis

    一 下载并安装 (1)下载: [root@localhost src]# wget http://download.redis.io/releases/redis-3.2.5.tar.gz (2)安装 ...

  3. Redis在linux上的配置

    一.安装gcc  1.Redis在linux上的安装首先必须先安装gcc,这个是用来编译redis的源文件的.首先需要先切换的到root用户 2.然后开始安装gcc: yum install gcc- ...

  4. Linux 下载安装配置Redis完整步骤

    安装: 1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 tar xzvf redis-4.0.8. ...

  5. 关于Redis在Linux手动安装配置

    安装: 1.获取redis资源 wget http://download.redis.io/releases/redis-5.0.0.tar.gz 2.解压 tar xzvf redis-5.0.0. ...

  6. Linux(CentOS6.8)配置Redis

    1.Redis简介 Redis:REmote DIctionary Server(远程字典服务器). Redis是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分 ...

  7. Redis学习笔记之一 : 配置redis

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...

  8. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  9. redis下载安装及php配置redis

    下载及安装redis 1.首先去github网站上下载https://github.com/dmajkic/redis/downloads: 2.根据实际情况,将64bit的内容cp到自定义盘符目录, ...

随机推荐

  1. asp.net 可视化操作(二)——Sql数据库连接及简单查询功能的实现

    目录 连接数据库 利用repeater控件实现数据显示 查询功能 页面CSS美化 数据插入.更新-- 连接数据库 添加test.aspx 添加控件SqlDataSource,选择配置数据源 选择新建连 ...

  2. Initialization failed for 'https://start.spring.io

    本文精华(没空的小伙伴,直接看精华部分即可) 1.精华1: 开发/下载项目的时候考虑系统必备的版本兼容性 2.精华2: 通过火狐浏览器访问官网的旧版本,下载到任意需要的项目版本,然后通过项目导入ide ...

  3. 【Android开发】【数据库】Realm For Android

    目录 1.Realm简介 2.环境配置 3.初始化Realm 4.创建实体 5.增 6.删 7.改 8.查 9.异步操作 10.数据库数据更新监听 11.json转对象,插入数据库 12.Demo地址 ...

  4. tomcat 安装配置及问题解决

    最近没写程序 刚想运行一个jsp程序发现tomcat出现一些问题,然后就重新装了程序,重新配置 总结经验就是不要怕报错,把错误复制下来,百度里面都有解决办法 要安装与自己jdk版本相匹配的tomcat ...

  5. java语言和jdk、jre基础

    Java语言平台 * J2SE(Java 2 Platform Standard Edition)标准版  * 是为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可以完成一些桌 ...

  6. 使用babel编译器将es6代码转为es5的方法

    1.首先需要安装工具 babel-cli =========  npm i babel-cli -g   install 可以使用i 代替 2.安装插件   npm i --save-dev babe ...

  7. Spring-JdbcTemplate(注入到spring容器)-02

    1.导入spring-jdbc和spring-tx坐标 <dependency> <groupId>junit</groupId> <artifactId&g ...

  8. Python-初见

    目录 概述 关键字 标准数据类型 Number String List Tuple Set Dictionary 删除对象 数据类型转换 推导式 运算符 迭代器与生成器 迭代器 生成器 函数 参数传递 ...

  9. 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!

    小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...

  10. Hyperledger Fabric无系统通道启动及通道的创建和删除

    前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织,但目前为止,我们启动 orderer 节点的方式都是通过系统通道的方式,这样自带系 ...