首页 > 其他 > 详细

redis 笔记

时间:2019-02-11 23:24:31      阅读:335      评论:0      收藏:0      [点我收藏+]

redis是C语言开发,安装redis需要将官网下载的源码进行编译,编译依赖于gcc环境

进入redis解压目录,使用make命令进行编译

安装redis:make PREFIX=/usr/local/redis install

在bin目录中会出现cli和server,这代表已经完成,这些不是安装程序

最后,需要将解压目录下的redis.conf文件拷贝到上面的bin同级目录下

这个配置文件可以进行端口号的修改等操作,如果没有,系统会启用默认配置;

端口号为6379

两种启动模式,

前端启动,无法部署集群(不建议使用)

客户端连接:redis-cli -h ip地址 -p端口

后端模式,

ctrl + c 关闭服务器

修改redis.conf,将守护进程改为yes

后端启动时,得同时指定配置文件

ps -ef查看进程

由于是通过配置文件启动的,所以我可以通过改变配置文件的属性,加载N回,因此可以进行部署集群的操作


redis 的关闭

kill -9 进程号(相当于断电,会丢失数据)

./bin/redis-cli shutdown 正常关闭


redis有五种数据类型:

String

hash-javaBean

list-LinkedList

set-HashSet

有序的set集合

key名不要过长,否则影响使用效率;

->因为他的key搜索规则是由短到长开始搜索

字符串在redis中是二进制安全的

二进制安全和数据安全没有关系

mysql-关系型数据库,所有的关系型数据库都是二进制不安全的【乱码丢失数据】

->因为他有频繁的编解码,执行效率低,并且容易乱码

而redis编码和解码只会发生在客户端。没有频繁的编解码,执行效率很高,不会出现乱码


String数据类型常用命令

set key value

get key ,如果key不存在,返回(nil)

del key ,返回值为删除了几条数据

getset key value 修改,先获取,后修改

incr key,如果不存在,则会初始化为0.在进行自增

decr key

append key value,如果不存在,则会自动创建,返回值为当前字符串的长度

incryby key increment

decryby key increment


hash数据类型常用命令

特点:占用的磁盘空间极少

flushdb 命令将数据库中的数据全部删除

hset key field value 设置单个变量的单个键值对

hmset key field value field2 value2 设置单个变量的多个键值对,用空格分隔

hget key field value

hmget key field field2

hgetall key 获取所有,以键值对双双出现

hdel key field 删除一个或者多个字段

del key 删除整个键值对

hincrby key field increment

hexists key field 若存在返回1,不存在返回0

hlen 获取key中的field数量

hkeys key 获取所有的字段

hvals key 获取所有的字段值

当某个key中的键值对全部删除后,这个key还存在吗?

->不存在了

keys * 可以查看所有的key


Jedis 为java操作redis的工具

连接后,注意打开端口对应的防火墙

在java中设置的变量,在linux中看,看到的是二进制数据,只有在java中获取时才可以看到解码的数据;

->应了最上面那句话

配置Jedis连接池


list数据类型常用命令

由于redis操作中,最多的操作是进行元素的增删,所以redis选择了链表

使用环境:做大数据集合的增删;任务队列

lrange key start end 获取某个索引范围内的元素值,可以为负数,若为-1,则表示链表尾部的元素

查询所有元素:lrange key 0 -1

没有rrange

lpush key value value2 在链表头部插入元素,如果该链表不存在,则自动创建一个;结果为元素的个数

rpush key value value2 在链表尾部插入元素

lpop key 返回并且弹出链表第一个元素,如果key不存在,返回nil

rpop key 从尾部弹出元素

llen key 获取元素的个数

lrem key count value 删除count个值为value的元素,如果count大于0,从头向尾开始删;如果count小于0,则从尾向头开始删,如果count等于0,则删除所有链表中等于value的元素

->不过该命令的效率极为低下,不建议使用;讲解说这种方式会为元素赋索引,导致速率变慢

通过索引替换元素:lset key index value

索引前/后插入元素:linsert key before/after pivot value

这个pivot指的是元素名称,讲解给的说明是不是错的呀

任务队列操作 rpoplpush resource destination 将链表的尾部元素弹出并且添加到另一个链表的头部

->此处默认的逻辑是,我们插入元素一边是从头部开始插入,所以尾部元素是最先插入的

循环队列 rpoplush list1 list1 两个链表是一个即可


set数据类型常用命令

set能存储特别多的元素,最大元素数量是4亿多

hashset 无序,不重复

redis操作中,涉及到两个大数据的并集,交集,差集运算

sadd key value value2 向set中添加数据

srem key value value2 删除

smembers key 获取可以中所有元素

sismember key member 判断指定成员是否在该set中,返回1或0(无论集合里面有多少元素都可以极快的返回结果)

集合运算

差集运算 sdiff A B 属于A但不属于B的元素集合,所以这个与key的顺序有关系

交集运算 sinter A B C...

并集运算 sunion A B C...

scard key 获取set中成员的数量

srandmember key 随机返回set中的一个成员

sdiffstore、sinterstore、sunionstore 将返回结果存储在一个集合中

规范:sinterstore destination A B C...


有序set集合

使用场景:专门用来做排行榜

zadd key score member score2 member2

如 zadd set1 5000 xiaoming 1000 xiaohong

zscore key member 获取指定成员的分数

zcard key 获取集合中成员数量

zrem key member1 member2 删除集合指定成员,批量删除

zrange key start end [withscores] 获取集合中某个范围内的成员,[withscores]参数表明返回的成员包含其分数,中括号表示可选,分数由小到大

zrevrange key start stop [withscores] 按照元素的分数从大到小的顺序返回索引范围内的所有元素,包括两端的元素,分数由大到小

zremrangebyrank key start stop 按照排名范围删除元素(其实就是按照索引进行删除)

zremrangebyscore key min marx 按照分数范围删除元素

zrangebyscore key min max [withscores] [limit 0 1] 按照分数范围进行排序,还可以进行分页,按照分数从低到高排序

zincryby key increment member

zcount key min max 获取分数在此范围内的成员

zrank key member 返回成员在集合中的排名,按照索引来的(由小到大)

zrevrank key member 返回成员在集合中的排名,按照索引来的(由大到小)


通用命令

key *

key ?

del key key2...

exists key

rename key newkey

type key 获取key对应的值类型,有序set集合会返回zset,如果不存在,会返回none

设置key的过期时间,默认为永久生存

expire key 30 单位:秒

ttl key 返回 key的剩余生存时间,如果没有设置时间,返回-1,如果超时不存在了,则返回-2


消息订阅与发布

subscribe my1 订阅频道

psubscribe my1* 批量订阅频道,订阅以my1开头的所有频道

publish my1 hello 在指定频道中发布消息,返回值为接受到信息的用户数

类似于桌面右下角的小广告

->所以这里的频道没有创建这一说


多数据库

redis默认有16个数据库,0, 1, 2....15

默认所有的数据操作,都是在0号数据库上操作的

切换数据库:select 数据库名

把某个键值对进行数据库移植:move key 数据库名,在当前数据库该键值对就不存在了

清空当前数据库:flushdb

清空服务器-所有数据库:flushall


事务

mysql事务:目的是为了保证数据完整性,安全

redis事务:目的是为了进行redis语句的批量化执行

multi 开启事务

exec 提交事务

discard 事务回滚

->当事务中某几个语句出错,程序不会自动进行事务回滚,其他语句正常执行


ping 如果返回PONG,代表连接成功,否则会返回no connected

quit 退出客户端,和ctrl+c一致

dbsize 返回当前数据库中的key数量

info 可以看到服务器和连接客户端的详细详细


持久化

持久化:把数据保存在硬盘上

关系型数据库 mysql,任何增删改语句,都是在硬盘上做的操作

内存(兔子):高效,断电数据就会消失

硬盘(乌龟):读写速度慢于内存,断电数据依旧存在

非关系型数据库redis:

默认情况下,所有的增删改,数据都是在内存中进行操作

断电以后,redis的部分数据会丢失,丢失的数据就是保存在内存中的数据

 

redis的两种持久化策略:

RDB:默认的策略,照快照,保存的是一种状态

20G数据 ---> 几kb快照

优点:

1)快照保存数据速度极快,还原也快

2)适用与灾难备份,例如redis服务器所在机房失火,我要赶紧儿将redis数据备份

缺点:

1)小内存机器不适合使用

RDB机制符合要求就会照快照。(随时随地启动),会占用一部分系统资源,

例如我有1G的数据,他会先将1G的数据先复制过来(此时内存就被占用2G了),进行压缩、备份、运算-->转化成dump.rdb文件

这个动作是突然的

Linux 4G

3G数据,这时进行rdb机制,很有可能因为内存不足直接宕机(宕机后,服务器会关闭,属于非正常关闭)

使用场景:内存比较充裕的计算机

->在安装目录下默认有dump.rdb

 

RDB何时进行照快照

服务器正常关闭时,照快照;redis-cli shutdown

key满足一定条件时,照快照;

save 900 1

save 300 10

save 60 10000

每15分钟至少有1个key发生变化,则照快照保存

 

AOF:

使用日志功能保存数据操作

同步规则:

每秒同步:安全性低,比较节省系统资源->怎么个理解法

每修改同步:只要有key变化语句,就进行AOF保存数据,比较安全,但是极为浪费效率

不同步(默认):不安全

 

AOF操作:只会保存导致key发生变化的语句

 

AOF配置:

1)将appendonly no 改成 appendonly yes,这一步时开启AOF机制;

2)策略的选择:将appendfsync always的注释去掉,每次key变化就进行保存

 

优点:

1)持续性占用极少量的内存空间,只有--KB,会专门开辟一个AOF日志程序;性价比很高哟

 

缺点:

1)日志文件会特别大,不适用于灾难备份;最终数据不多,但是过程语句复杂;

例子:1G数据,由10G的语句生成

2)恢复效率远远低于RDB

 

适用场景:内存比较小的计算机,所以大公司会选择用默认RDB的方式

 


linux通过sed 修改文件中某一行的内容

sed -ie ‘s/daemonize no/daemonize yes/g‘ redis.conf

 

在vim的底行模式下,

用:/字符串内容 也可以进行查找

 

redis 笔记

原文:https://www.cnblogs.com/syjp/p/10363557.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!