`

Redis简单使用

阅读更多
Redis数据类型
redis常用五种数据类型:string,hash,list,set,zset(sorted set).
String类型
String是最简单的类型,一个key对应一个value
String类型的数据最大1G。
String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby),这种情况下,该integer的值限制在64位有符号数。
在list、set和zset中包含的独立的元素类型都是Redis String类型。
List类型
链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
List的最大长度是2^32-1个元素。
Set类型
集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
在Redis中,set就是Redis String的无序集合,不允许有重复元素。
Set的最大元素数是2^32-1。
Redis中对set的操作还有交集、并集、差集等。
ZSet(Sorted Set)类型
Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
Zset的最大元素数是2^32-1。
对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。
hash类型
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
操作命令
对value操作的命令
     exists(key):确认一个key是否存在
     del(key):删除一个key
     type(key):返回值的类型
     keys(pattern):返回满足给定pattern的所有key
     randomkey:随机返回key空间的一个key
     rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
     dbsize:返回当前数据库中key的数目

     expire:设定一个key的活动时间(s)
     ttl:获得一个key的活动时间
     select(index):按索引查询
     move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
     flushdb:删除当前选择数据库中的所有key
     flushall:删除所有数据库中的所有key

对String操作的命令
     set(key, value):给数据库中名称为key的string赋予值value
     get(key):返回数据库中名称为key的string的value
     getset(key, value):给名称为key的string赋予上一次的value
     mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
     setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
     setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
     mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
     msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i
     incr(key):名称为key的string增1操作
     incrby(key, integer):名称为key的string增加integer
     decr(key):名称为key的string减1操作
     decrby(key, integer):名称为key的string减少integer
     append(key, value):名称为key的string的值附加value
     substr(key, start, end):返回名称为key的string的value的子串
对List操作的命令
     rpush(key, value):在名称为key的list尾添加一个值为value的元素
     lpush(key, value):在名称为key的list头添加一个值为value的 元素
     llen(key):返回名称为key的list的长度
     lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
     ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
     lindex(key, index):返回名称为key的list中index位置的元素
     lset(key, index, value):给名称为key的list中index位置的元素赋值为value
     lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。
     lpop(key):返回并删除名称为key的list中的首元素
     rpop(key):返回并删除名称为key的list中的尾元素
     blpop(key1, key2,… key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。
     brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
     rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

对Set操作的命令
     sadd(key, member):向名称为key的set中添加元素member
     srem(key, member) :删除名称为key的set中的元素member
     spop(key) :随机返回并删除名称为key的set中一个元素
     smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
     scard(key) :返回名称为key的set的基数
     sismember(key, member) :测试member是否是名称为key的set的元素
     sinter(key1, key2,…key N) :求交集
     sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
     sunion(key1, key2,…key N) :求并集
     sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
     sdiff(key1, key2,…key N) :求差集
     sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合

     smembers(key) :返回名称为key的set的所有元素
     srandmember(key) :随机返回名称为key的set的一个元素
对zset(sorted set)操作的命令
     zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
     zrem(key, member) :删除名称为key的zset中的元素member
     zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
     zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
     zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
     zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
     zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
     zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素
     zcard(key):返回名称为key的zset的基数
     zscore(key, element):返回名称为key的zset中元素element的score
     zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素
     zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
     zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
对Hash操作的命令
     hset(key, field, value):向名称为key的hash中添加元素field<—>value
     hget(key, field):返回名称为key的hash中field对应的value
     hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
     hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
     hincrby(key, field, integer):将名称为key的hash中field的value增加integer
     hexists(key, field):名称为key的hash中是否存在键为field的域
     hdel(key, field):删除名称为key的hash中键为field的域
     hlen(key):返回名称为key的hash中元素个数
     hkeys(key):返回名称为key的hash中所有键
     hvals(key):返回名称为key的hash中所有键对应的value
     hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

应用场景
String类型的应用场景
String是最常用的一种数据类型,普通的key/value存储.

list类型的应用场景
比较适用于列表式存储且顺序相对比较固定,例如:
省份、城市列表
品牌、厂商、车系、车型等列表
拆车坊专题列表...

set类型的应用场景
Set对外提供的功能与list类似,当需要存储一个列表数据,又不希望出现重复数据时,可选用set

zset(sorted set)类型的应用场景
zset的使用场景与set类似,区别是set不是自动有序的,而zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择zset数据结构。例如:
根据PV排序的热门车系车型列表
根据时间排序的新闻列表

hash类型的应用场景
类似于表记录的存储
页面视图所需数据的存储


数据快照配置
save 900 1
save 300 10
save 60 10000
以上在redis.conf中的配置指出在多长时间内,有多少次更新操作,就将数据同步到数据文件,这个可以多个条件配合.上面的含义是900秒后有一个key发生改变就执行save,300秒后有10个key发生改变执行save,60秒有10000个key发生改变执行save

Redis AOF
数据快照的缺点是持久化之后如果出现crash则会丢失一段数据,因此redis作者增加了另外一种追加式的操作日志记录,叫append only file,其日志文件以aof结尾,我们一般称为aof文件.要开启aof日志的记录,需要在配置文件中进行如下设置:
appendonly yes
appendonly配置如果不开启,可能会在断电时导致一段时间内的数据丢失.因为redis本身同步数据文件是按save条件来同步的,所以有的数据会在一段时间内只存在于内存中.

appendfsync no/always/everysec
1. no:表示等操作系统进行数据缓存同步到磁盘.
2. always:表示每次更新操作后手动调用fsync() 将数据写到磁盘.
3. everysec:表示每秒同步一次.一般用everysec

AOF文件只增不减会导致文件越来越大,重写过程如下

1. Redis通过fork产生子进程.
2. 子进程将当前所有数据写入一个临时文件.
3. 父子进程是并行执行的,在子进程遍历并写临时文件的时候,父进程在照常接收请求,处理请求,写AOF,不过这时他是把新来的AOF写在一个缓冲区中.
4. 子进程写完临时文件后就会退出.这时父进程会接收到子进程退出的消息,他会把自己现在收集在缓冲区中的所有AOF追加在临时文件中.
5. 最后把临时文件rename一下,改名为appendonly.aof, 这时原来的aof文件被覆盖.整个过程完成.

Redis数据恢复

当redis服务器挂掉时,重启时将按以下优先级恢复数据到内存种:
1. 如果只配置了AOF,重启时加载AOF文件恢复数据.
2. 如果同时配置了RBD和AOF,启动时只加载AOF文件恢复数据.
3. 如果只配置了㻾DB,启动时将加载dump文件恢复数据.
Redis主从复制
Redis主从复制配置
Master/Slave配置:
Master IP:175.41.209.118
Master Redis Server Port:6379

Slave配置很简单,只需要在slave服务器的redis.conf加入:
slaveof 175.41.209.118 6379
启动master和slave,然后写入数据到master,读取slave,可
以看到数据被复制到slave了

Redis主从复制过程
配置好slave后,slave与master建立连接,然后发送sync命令. 无论是第一次连接还是重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存. 后台进程完成写文件后,master就发送文件给slave,slave将文件保存到硬盘上,再加载到内存中, 接着master就会把缓存的命令转发给slave,后续master将收到的写命令发送给slave. 如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像, 然后发送给所有的slave

Redis主从复制特点
1. master可以拥有多个slave.
2. 多个slave可以连接同一个master外,还可以连接到其他slave.
3. 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求.
4. 可以在master禁用数据持久化,注释掉master配置文件中的所有save配置,只需在slave上配置数据持久化.
5. 提高系统的伸缩性

推荐主从模式A --> B --> C单向链表式
A为master读写都直接对A操作,A节点不配置数据持久化
B 节点也不配置数据持久化
C 节点配置数据持久化

这样
1. 当A节点出现故障,将读写操作切入到B节点,然后将A节点修复后追加到C节点后, 关闭C节点的数据持久化,将追加到C节点后的A节点开启数据持久化。
2. 当B节点或者C节点出现故障,直接修复该节点,并按照最初配置启动即可。
分享到:
评论

相关推荐

    redis简单使用实例

    相关用法可以到这篇博客查看https://blog.csdn.net/w1lgy/article/details/84940774

    Redis使用教程,详解

    Java实现redis,linux安装redis,一分钟学会使用redis,就是这么简单

    redis的简单操作

    redis的常见的操作,包括打开,关闭,基本操作等。个人收集的,适合小白。

    springmvc整合redis简易Demo.zip

    springmvc整合redis简易Demo.zip springmvc整合redis简易Demo.zip

    WPF操作Redis简单实例

    C# 简单操作Redis。里面含WPF版本和独立的客户端版本。 Redis文件夹为独立的版本,WpfRedis为WPF版本。可能实际使用WPF比较简单啊。

    C# Redis 基础使用

    C# Redis的简单操作, 适合初学者使用,有缓存可视化的winform小工具,Redis基础底层操作的各种方法,增删查改。

    C#中使用redis简单实例

    使用vs2017做的c#中使用redis的简单例子,实现了,键 的添加 删除 修改,适合新手练习,学习

    redis 使用demo

    redis 使用demo,在代码中 简单的使用了 redis 的操作

    redis-windows-7.0.11

    redis-windows提供了一个简单易用的界面,可以让用户轻松地启动、停止和重启Redis服务器,以及管理Redis的配置文件、日志文件和数据文件。此外,redis-windows还提供了一些有用的功能,如监控Redis服务器的性能、...

    redis的简单使用.pdf

    redis的使用

    redis简单安装

    redis简单安装,

    redis编码转换器

    redis中使用utf8编码,使用c#简单完成转换。

    java_redis简单案例

    此资源为demo测试方法,使用前请安装redis服务。仅供参考

    Redis简单应用代码

    Redis简单应用代码

    redis 使用说明

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-...• Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份

    简单的redisdemo

    简单的redisdemo,redis的建的使用方法的demo,接触了解redis使用

    SpringMVC+redis集成demo,超简单使用案例

    SpringMVC+redis 简单案例,实现了简单的redis存取功能,以及springmvc的实例化功能,SpringMVC+redis 简单案例,实现了简单的redis存取功能,以及springmvc的实例化功能,SpringMVC+redis 简单案例,实现了简单的...

    Java调用Redis 简单Demo

    Java调用Redis 简单Demo

    redis网络事件框架的使用

    redis封装了一个小型网络库...它简单地演示了redis网络模块的使用。 这个程序由6个源文件组成,ae.h, ae.c, ae_epoll.c, anet.h, anet.c, main.c组成,main.c由我原创,其他源文件来自于redis源代码(注释版,有改动)

    C#使用Redis内存数据库

    使用类库为ServiceStack.Redis,使用简单的RedisManger类进行操作,写入字符串和读取字符串, ///2。使用类库为ServiceStack.Redis,使用简单的RedisManger类进行操作,写入对象和读取对象, ///3。使用类库为...

Global site tag (gtag.js) - Google Analytics