文档章节

redis 学习2

之渊
 之渊
发布于 08/19 21:25
字数 2022
阅读 42
收藏 0

网站

 

启动 

服务端

启动redis 服务端

在redis 安装目录下 src 里面

./redis-server &
 

可以指定 配置文件或者端口

 

客户端

 

在 redis 的安装目录里面的 src 里面

./redis-cli 

 可以指定 指定 连接 服务端的端口 或者  ip 

默认连接的端口是6379 

可以指定连接的 密码

关闭

 

配置

 

redis 关闭

  关闭服务器端,  使用 kill -9 pid 即可,

当然了 关闭 redis 服务的时候并没有将最近操作的给持久化到磁盘,

因此 客户端要  执行 save 命令即可。

但是不建议这样使用

应该在 redis 安装目录 下的 src 下面 使用  ./redis-cli shutdown 

这样 就可以保持 最近的记录持久化到磁盘了, redis 服务也就关闭了

基础命令

keyspace

用途:比如 多个测试环境, 每个测试环境存的数据就使用对应的 db 即可, 这样 在代码里面控制切换即可。

默认都是使用 db0 

切换 DB命令: select  index  , 比如 select 10 就切换到 db10 了

flush

flushdb 清除当前的 db

flushall  清除当前所有的 keyspacce 里面的db , 所有的key

dbsize
 

当前 db里面有多少个 key 的数量

quit 

退出  客户端连接

 

键命令

ttl   查询 剩余生存时间

就是 查询 对应的  key的剩余生存时间

比如    ttl a  如果返回 -1 代表永久生存,没有时间限制

如果返回值是 1 就是马上结束了,如果是  -2 表示已过期,该key已被删除


expire 设置过期时间

比如 expire a 10 即 10秒后过期

比如 在 存储 session 这样 ,模拟session 的有效期

type

返回key 的类型

比如 type b  返回  string

如果返回 none 就代表 不存在该key 即没有类型了

rename  重命名key

比如 rename a d 即将 key为 a 的重命名为 d

但是如果 被重命名的 key 已存在,旧值将会被删除。

比如  存在 key  a 和 d , rename a d  之后, a将被 d 覆盖,而原来的 d  的值将 被 改为 对应 a的key的值。

会覆盖已存在的。

 

renamenx  与nx

即 如果 对应的 key 已存在将 rename 失败

renamenx a b  , 因为 b 已存在 ,因此 renamenx 不成功。

就  nx 就去校验,如果对应的 key 已存在则 不执行对应的命令
renamenx a m 将成功,因为不存在 key为 m的 

setex 

设置对应的key 并 给与有效期

比如 setex c 100 c 即  设置一个 key为c 值为 c ,有效期为 100秒

psetexx  设置过期时间为毫秒

psetex d 10000 d 

这里是 设置一个 key d 的 值为d 过期时间 为 10000 毫秒


monitor

可以通过 monitor 来 查看redis 的日志和记录,排查问题时候,比较好用

 

数据结构

string 

默认就是 字符串类型

getrange 获取对应 key的内容的 范围

比如 getrange word 0 2  

获取 key 为 word 的内容 的 index 从 0到2 的内容,包括 2 的内容 

getset 

获取并设置, 并且会将 旧的值给返回 

mset  批量 设置 key 

mset  a1 a1 b1 b1 c1 c1


mget 批量获取 key的值

比如 mget  a1 b1 同时获取 ba, b1 的内容

setnx

当 key 不存在才会 set 成功,存在则设置失败

不会覆盖存在的 key

msetnx  批量 设置 不存在的 key 

同时它是具有 原子性的,要么都设置成功,要么都设置 失败。 只要当某个设置 不成功,其余都不成功

append 增加内容

即在 value 后面 加上 对应的内容

incr 自增

每次执行 都会将 对应 key 的value 是数字的 自增 1 

value 必须为 数值,且没有超出范围, 比如 integer 类型

incrby  设置自增步长

比如  incrby 1 100  自增 100 ,将原值加上 100 

decr 自减

减少 1 , 将 值 减 1 

decrby 根据 幅度 自减

比如 decrby 1 100 自减 100 

 

哈希hash

hexists 判断map是否存在

 hexists map xx 

hsestnx map xxkey  xxvalue 

即 如果 key 不存在才 设置成功,否则存在就不能设置

 

list 列表

lpush

lpush list 1 2 3 4 5 6 7 8 9 10
 也就是 最后放入的 就在 最首位

lrange list 0 1 结果是 10 , 9 

lpop 移除 列表第一个元素


lpop list 将list 移除 第一个 元素, 比如 10 

rpop 移除列表最后一个

lrange 范围 显示,不会出现越界的情况

lrange list  0 100

如果 list 列表只有几个元素,就将  list 内容都显示出来,超过了100 才会只显示 0到 100 的

 

set 集合 ,去重,无序

scard 
将  set 集合所有内容数量都显示出来

sdiff 差集, sinter 交集, sunion 并集

即获取两个集合的差集 

sdiff set1 set2  即显示 set1 相对 set2 的差集

srem 移除 元素 

spop 随机移除一个元素,并返回移除的元素

可以使用在一些随机获取内容的场景:比如 用户下单的时候,从set 集合里面随机获取一个订单号给对应的订单。

获取也可以用于抽奖相关的场景

sortedset 有序集合

zadd

zadd sortedset1 100 a 200 b 300 c 即 一个集合 ,第一元素a的值是 100 ,第二是 200 ,第三个是 300

将会按照 值给排序,默认是从小到大排序

zincrby  新增对应的内容

zincrby soredset 1000 a
将 a的值 增加 1000

zrange 范围取值,闭区间方式,不会出现越界

zrange sortedset 0 100


score 显示分数

zrange sortedset 0 100 withscores 

将 集合的内容 从 0到 100 显示,并显示分数

zscore sortedset b  现在 key 为 b的值 分数

 

key 命名可以 带上 :

比如 set aa:bb:cc  abc

这样就 存在 key 为  aa:bb:cc 值为 abc 了。

将会 以 树状的 结构方式 存储 内容的。

比如可以加上 set aa:bb:dd abd  

这样就比较规范,而且维护也比较好,比如来一个 商品的 good  之后接着其他属性。

比如 good:name  ,  good:price  等 ,

可以这样方式来 命名    redis 的 key 

分布式redis
 

可以将 已经 解压安装好的redis 文件夹 给 复制一份,就是另一个redis了,稍微配置一下,就可以做完另一个redis 来用了。

一致性hash算法

环形hash空间

命中率公式: (1 - n/(n+m) )* 100% 

n 代表 服务器节点, m 代表 变动的服务器数量。

随着 分布式集群的服务器越多,当 服务器节点变动的M越大,那么命中率越高,受到的影响越低。

而且有虚拟节点,因此影响就更低了

 

redis 物理形态是集群,工作方式是 分布式。

保证高可用就是 每一个分布式节点的 redis 配置 主从, 一般 可以不用 分布式的redis形式,

可以来一个 redis 主从即可 来保障高可用即可。除非 需要缓存的数据量很大,需要使用分布式加主从的方式。

 

spring session 

 

官网 https://spring.io/projects/spring-session

里面就有一些使用 的 demo 了

 

总结

如果不想对之前的代码进行修改,可以使用 spring session 结合redis,

如果要自定义 ,和灵活性,则可以自己实现了 

 

redis 分布式锁

实现用的命令

setnx 不存在就设值 , getset 获取旧对的值,获取旧的值, expire 设值过期,  del删除

流程图

 

优化版

 

参考代码 https://www.cnblogs.com/zuolun2017/p/8028208.html

redisson 框架

 

 

redis 主从

redis 配置主从很简单, 从库只能读,不能写

同时 主从的话,就不用 使用 redis 的 分布式分片功能了。

具体怎么使用就根据具体情况进行 使用了

 

 

 

 

 

 

 

本文转载自:https://coding.imooc.com/lesson/162.html

之渊
粉丝 13
博文 642
码字总数 195719
作品 0
佛山
程序员
私信 提问
redis的学习和使用

最近自己学习redis,把学习过程中的一些细节整理了一下: redis 安装: 默认端口是6379 # cd /usr/local/src # wget http://download.redis.io/releases/redis-3.0.7.tar.gz #tar zxvf redi...

许兆磊
2016/04/03
342
0
spring和redis的整合

扯淡: 最近一直在慢慢多学习各个组件,自己搭建出一些想法。是一个涉猎的过程,慢慢意识到知识是可以融汇贯通,举一反三的,不过前提好像是研究的比较深,有了自己的见解。自认为学习能力不...

Zero零_度
2016/08/30
50
0
【独家】用Redis-ML模块实现实时机器学习!

刚刚结束的RedisConf2017大会,在国外是比较大型的Redis盛会了,而且已经举办多年,每次都会在全球邀请业界知名公司的技术大咖分享他们在企业应用中的典型案例和踩过的坑,以及他们正在积极探...

张冬洪 译
2017/06/23
0
0
2017-05-09日志

1,上午跟钰姐一起研究质监局门户栏目列表,添加判断实现二级菜单标题处显示一级菜单名称,稍微了解freeMarker代码格式,并对逻辑有一定了解。 2,在菜鸟教程学习redis,下载redis的压缩包并...

麦兜鱼丸
2017/05/09
2
0
Redis学习(二)、JAVA操作Redis

Redis学习(二)、JAVA操作Redis 一、测试连接Redis是否连通 1、导包 2、写一个RedisJava类测试 控制台输出为: 二、测试向redis中存入字符串和字符串 1、导包 2、写一个名为RedisStringJava...

Qiu_CJ
2018/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
19分钟前
2
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
22分钟前
2
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
40分钟前
8
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
55分钟前
7
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
625
11

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部