Redis基础学习

type key 查看key的类型。

select 1 切换库 默认有16个数据库,0-15

吐出就是吐出来的意思,吐出来说明肚子里面没有了

数据类型

字符串 String

介绍

        String类型是二进制安全的。意味着Redis的String可以包含任何数据。比如jpg图片或者序列化对象。

底层结构

        String 类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是M
        String是一个动态字符串,底层类似ArratList的一个实现,设置初始大小,后续扩容。

常用操作

set <key> value 添加键值 
mset <key1> value1 <key2> value2 .... 设置多个keyvalue
setnx <key> value 当key不存在时设置key的值,set相同key会直接覆盖
msetnx 结合mset 和setnx
        原子性设置保存要么全部一成功要么一起失败,有一个设置失败全部失败
setxx <key> value 当key存在时设置覆盖原先key的值。
settrange <key> <起始位置> value 将value插入到key的value<起始位置>的索引处
appande <key> value 将数据追加至对应key的value后
incry <key> <步长> 将数字型 value + <步长> 、decry key <步长> 将数字型value - <步长>
       因为Redis是单线程操作,所以不用担心增加和删除的并发问题。
getset <key> value 取旧值换新值

expire <key> 10 10秒钟:为指定的key设置过期时间
setex <key> <过期时间> value 设置键值时同时设置过期时间。
ttl <key> 查看还有多少秒过期,-1表示永不过期,-2表示已过期。

get <key> 查询key的值
mget key1 key2 ... 取多个value
getrange <key> <其实位置><结束位置> 类似String.substring();
exists <key> 判断某个key是否存在。
keys * 查看当前库所有key。

del <key> 删除指定key的数据类型。
unlink <key> 根据value选择非阻塞删除:仅将key从keyspace中删除,真正的删除在后续异步操作。
dbsize 查看当前Redis库当中key的数量
flushdb 清空当前库 / flushall 清除所有库

列表 List

介绍

        单健多值、双向链表、保存了头节点和尾节点,对头尾操作效率较高,对中间操作效率较低。

底层结构

         List的数据结构为快速链表quickList:在列表元素较少的情况下会使用一块连续的内存存储,这个结构式ziplist。即压缩列表。 他将所有的元素紧挨在一起,分配一块连续的内存。
        当数据量较大时会改成quickList。因为普通的链表每个节点都需要附带指针,比较浪费空间。
        Redis将链表和zipList结合起来组成了quickList。将多个zipList使用双向指针进行串联。(链表串数组)

常用操作

        Ipush <key> value1 value2 value3 结果  key :value3-value2-value1   左插。
        rpush <key> value1 value2 value3 结果  key :value1-value2-value3   右插。

        linsert <key> before <value> <newValue> 在value后面插入 newValue 

        rpoplpush <key1> <key2> 从key1右边取一个值,插入到key2的左边
        lpop/rpop 从左边吐出一个值或者从右边吐出一个值。值在键在,值光键亡。
        lrange <key> <start>  <stop> 按照索引获取下表元素(从左到右),(0, -1)表示取全部。
        lindex <key> <index> 从左边计数 获取索引处元素
        llen <key> 获取链表长度

        lrem <key> <index> <value> 从左边开始删除n个value (从左到右)
        lset <key> <index> <value> 将列表key下标为index的值替换成value

Redis集合Set

介绍

        和list相似,但是可以去重

底层结构

        通过hash表进行实现,类似HashSet。 是一个String型的无序集合。
        随着数据的增加,执行时间的长短,查找删除添加复杂度都是O(1)。

常用操作

sadd <key> <value1> <value2>...... 插入多个数据,已经存在的将会被忽略

smembers <key> 取出该key所有的值。
sismember <key> <value> 判断集合<key> 是否含有该value的值,yes return 1 else 0。
scard <key> 返回该集合的元素个数。
srem <key> <value1> <value2> ......删除key的某些元素。
spop <key> 随机从该集合中吐出一个值。
srandmember <key> <n> 从key随机取出n个值 ,不会进行删除操作。

smove <key1> <key2> <value> 将key1中的value移动到key2中
sinter <key1> <key2> 返回两集合交集
sunion <key1> <key2> 返回两集合并集
sdiff <key1> <key2> 返回两级和差集

Redis哈希(Hash)

介绍

        Redis hash 是一个键值对集合,Redis hash 的value是一个String类型的field和value的映射表,hash特别适合存储对象。类似java中的Map<String,object>

底层结构

        Hash类型对应数据结构是两种:zipList(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用zipList,否则使用hashtable。

常用操作

hmset <key> <field> <value> 插入给field赋值
hmset <key> <field1> <value1> <field2> <value2>  按照键值插入数据对field赋值value
hsetnx <key> <field> <value> 将hash表key中field的值设置成value,当且仅当域field不存在
hincrby <key> <field> <increment> 为哈小标key中的域field的值加上增量 increment

hget <key> <field> 从key中取field属性的值
hexists <key> <field>查看hash表key中,给定域field是否存在
hkeys <key> 列出key集合所有的field
hvals <key> 列出key集合所有的value

Redis有序集合Zset(sorted set)

介绍

        Zset类似于普通集合set,是一个没有重复元素的字符串集合。
        不同之处有序集合每个成员都关联了一个评分(score),这个评分用来排序,从低到高。集合成员唯一,但是评分可以重复。

底层结构

         zset底层采用hash和跳表的方式进行实现,hash中的field用来存储分数。
         跳跃表:实现比红黑树简单,但是速率接近红黑树        

常用操作

        zadd <key> <score1> <value1> <score2> <value2> 将一个或者多个member元素及score加入到集合当中。
        zincrby <key> <increment> <key> 为元素score加上增量

       查询 在后面添加WITHSCORES可以把分数也显示出来。
        zrange <key> <start> <stop> 【WITHSCORES】在后面添加WITHSCORES可以把分数也显示出来。
        zrangebyscore key min max 【WITHSCORES】获取min - max 分数数据
        zcount <key> <min> <max> 统计分数区间value个数
        zrank <key><value> 返回该值在集合中的排名 ,从0开始。

        zrem <key><value> 删除集合下,指定的值

BitMaps

介绍

      开发工程中经常有些Boolean类型数据需要进行存储,或者记录用户的浏览记录。比如一个用户一年内的签到次数、比如不同时间点不通用对某个页面的访问情况。如果需要存储的数据两上百亿,那么需要存储的内存空间非常大。为了解决这个问题,Redis提供了位图结构。

        一个value可以存储2^32位,写速度位O(1),读取时速度位O(n),操作非常快。大量数据可以采用BitMap进行存储,少量数据采用set更佳

set和BitMap存储一天活跃用户对比
数据类型每个用户Id占用空间存储用户量全部内存量
集合类型64位5*10^764位*5*10^7 = 4 00MB
BitMaps1位10^81* 10^8 = 12.5MB

        很明显,使用bitMap可以节省很多的空间,随着后续时间的变化,节省的内存大小会越来越可观。
        因为bitMap在第一次时会开辟较大空间,所以少量用户的时候,比如只有10万(大量僵尸用户),那么不太适合使用bitMap,如下表所示

十万活跃用户
数据类型每个用户Id占用空间存储用户量全部内存量
集合类型64位10^564位*10^5 = 800KB
BitMaps1位10^81* 10^8 = 12.5MB

底层结构

        就是key然后指向一段连续的内存地址。注:如何计算偏移量这边后续补充。

常用操作

setbit <key> <offset> <value> 设置BItMap中某个偏移量的值(0或者1)偏移量从0开始。

getbit <key> <offset> 获取偏移量处的数据。
bitcount <key> <start> <stop> 不加参数获取key中所有1的数量 , start - stop 索引内1的数量。

bittop and(or/not/xor) <destkey> <key1> <key2> <key3> ...... 获取多个key的 and(交集)、or(并集)、not(非)、xor(异或),将结构存储到destkey当中。

HyperLogLog 

介绍

        工作当中,我们经常会遇到与统计相关需求,比如统计网站的访问量,可以使用Redis的incr、incrby轻松实现。
        但是比如UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题被称为基数问题。
        基数问题解决方案:
​​​​​​​        (1)数据存储在MySQL表中,使用distinct count计算不重复个数
        (2)使用Redis提供的Hash、set、bitMaps 等数据结构进行处理
        以上方案结果精确,但是随着数据不断增加,会导致占用的空间越来越大,对于大量数据集时不切实际的。
        Redis推出了HyperLogLog,降低一定的精度来平衡存储空间。在输入元素或者体积非常大时,计算基数所需要的空间总是固定的、并且很小。
        在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。
       但是 HyperLogLog指会根据输入的元素计算基数,而不会存储元素本身。所以HyperLogLog无法像集合那样,返回输入的各个元素
        什么是基数:例如{1,2,3,2,1,6},基数集就是{1,2,3,6},基数(不重复元素就为)5。基数估算就是在误差可接受范围内,快速计算基数。

底层结构

常用操作

pfadd key <element> <element1> <element2> .........添加指定元素到HyperLogLog当中。成功添加元素输出1,添加失败返回0(添加了集合中的重复数据)。

pfcount <key>查看集合中的基数

pfmerge <key> <key1> <key2> .. 将所有key的元素加入到key当中

GEO geographic

介绍

        用来存储地理经纬度,可以用来计算距离,longitude范围 (180°,-180°),latitude的范围(-85.05112878°,8505112878°)。
        当坐标位置超出指定范围,该命令会返回一个错误。
​​​​​​​        已经添加的数据无法向内添加。

底层结构

常用操作

geoadd <key> <longitude> <latitude> <member> [longitude latitude member ........] 添加地理位置(经度,维度,名称)

 geodist <key> <member>  通过key 和名称获取名称所在的经纬度。

 geodist <key> <member1> <member2> [ m | km | ft | mi ] 获取两个位置之间的直线距离。
        m:表示单位位米(默认值)
        ​​​​​​​km:表示单位千米
        mi:表示单位英里
        ​​​​​​​ft:表示单位英尺

georadius <key> <longitude> <latitude> raids [ m | km | ft | mi ] 以给定的经纬度为中心,找出某一半径内的元素。

配置介绍

Redis.config

# Redis示例配置文件
 
# 注意单位问题:当需要设置内存大小的时候,可以使用类似1k、5GB、4M这样的常见格式:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# 单位是大小写不敏感的,所以1GB 1Gb 1gB的写法都是完全一样的。
 
# Redis默认是不作为守护进程来运行的。你可以把这个设置为"yes"让它作为守护进程来运行。
# 注意,当作为守护进程的时候,Redis会把进程ID写到 /var/run/redis.pid
daemonize no
 
# 当以守护进程方式运行的时候,Redis会把进程ID默认写到 /var/run/redis.pid。你可以在这里修改路径。
pidfile /var/run/redis.pid
 
# 接受连接的特定端口,默认是6379。
# 如果端口设置为0,Redis就不会监听TCP套接字。
port 6379
 
# 如果你想的话,你可以绑定单一接口;如果这里没单独设置,那么所有接口的连接都会被监听。
#
# bind 127.0.0.1
 
# 指定用来监听连接的unxi套接字的路径。这个没有默认值,所以如果你不指定的话,Redis就不会通过unix套接字来监听。
#
# unixsocket /tmp/redis.sock
# unixsocketperm 755
 
#一个客户端空闲多少秒后关闭连接。(0代表禁用,永不关闭)
timeout 0
 
# 设置服务器调试等级。
# 可能值:
# debug (很多信息,对开发/测试有用)
# verbose (很多精简的有用信息,但是不像debug等级那么多)
# notice (适量的信息,基本上是你生产环境中需要的程度)
# warning (只有很重要/严重的信息会记录下来)
loglevel verbose
 
# 指明日志文件名。也可以使用"stdout"来强制让Redis把日志信息写到标准输出上。
# 注意:如果Redis以守护进程方式运行,而你设置日志显示到标准输出的话,那么日志会发送到 /dev/null
logfile stdout
 
# 要使用系统日志记录器很简单,只要设置 "syslog-enabled" 为 "yes" 就可以了。
# 然后根据需要设置其他一些syslog参数就可以了。
# syslog-enabled no
 
# 指明syslog身份
# syslog-ident redis
 
# 指明syslog的设备。必须是一个用户或者是 LOCAL0 ~ LOCAL7 之一。
# syslog-facility local0
 
# 设置数据库个数。默认数据库是 DB 0,你可以通过SELECT <dbid> WHERE dbid(0~'databases' - 1)来为每个连接使用不同的数据库。
databases 16
 
################################ 快照 #################################
 
#
# 把数据库存到磁盘上:
#
#   save <seconds> <changes>
#   
#   会在指定秒数和数据变化次数之后把数据库写到磁盘上。
#
#   下面的例子将会进行把数据写入磁盘的操作:
#   900秒(15分钟)之后,且至少1次变更
#   300秒(5分钟)之后,且至少10次变更
#   60秒之后,且至少10000次变更
#
#   注意:你要想不写磁盘的话就把所有 "save" 设置注释掉就行了。
 
save 900 1
save 300 10
save 60 10000
 
# 当导出到 .rdb 数据库时是否用LZF压缩字符串对象。
# 默认设置为 "yes",所以几乎总是生效的。
# 如果你想节省CPU的话你可以把这个设置为 "no",但是如果你有可压缩的key的话,那数据文件就会更大了。
rdbcompression yes
 
# 数据库的文件名
dbfilename dump.rdb
 
# 工作目录
#
# 数据库会写到这个目录下,文件名就是上面的 "dbfilename" 的值。

# 累加文件也放这里。

# 注意你这里指定的必须是目录,不是文件名。
dir /usr/local/work/Redis/file/
 
################################# 同步 #################################
 
#
# 主从同步。通过 slaveof 配置来实现Redis实例的备份。
# 注意,这里是本地从远端复制数据。也就是说,本地可以有不同的数据库文件、绑定不同的IP、监听不同的端口。
#
# slaveof <masterip> <masterport>
 
# 如果master设置了密码(通过下面的 "requirepass" 选项来配置),那么slave在开始同步之前必须进行身份验证,否则它的同步请求会被拒绝。
#
# masterauth <master-password>
 
# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:
#
# 1) 如果 slave-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
# 2) 如果 slave-serve-stale-data 设置为 "no",slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
#
slave-serve-stale-data yes
 
# slave根据指定的时间间隔向服务器发送ping请求。
# 时间间隔可以通过 repl_ping_slave_period 来设置。
# 默认10秒。
#
# repl-ping-slave-period 10
 
# 下面的选项设置了大块数据I/O、向master请求数据和ping响应的过期时间。
# 默认值60秒。
#
# 一个很重要的事情是:确保这个值比 repl-ping-slave-period 大,否则master和slave之间的传输过期时间比预想的要短。
#
# repl-timeout 60
 
################################## 安全 ###################################
 
# 要求客户端在处理任何命令时都要验证身份和密码。
# 这在你信不过来访者时很有用。
#
# 为了向后兼容的话,这段应该注释掉。而且大多数人不需要身份验证(例如:它们运行在自己的服务器上。)

# 警告:因为Redis太快了,所以居心不良的人可以每秒尝试150k的密码来试图破解密码。
# 这意味着你需要一个高强度的密码,否则破解太容易了。
#
requirepass yg1505272629
 
# 命令重命名
#
# 在共享环境下,可以为危险命令改变名字。比如,你可以为 CONFIG 改个其他不太容易猜到的名字,这样你自己仍然可以使用,而别人却没法做坏事了。
#
# 例如:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# 甚至也可以通过给命令赋值一个空字符串来完全禁用这条命令:
#
# rename-command CONFIG ""
 
################################### 限制 ####################################
 
#
# 设置最多同时连接客户端数量。
# 默认没有限制,这个关系到Redis进程能够打开的文件描述符数量。
# 特殊值"0"表示没有限制。
# 一旦达到这个限制,Redis会关闭所有新连接并发送错误"达到最大用户数上限(max number of clients reached)"
#
# maxclients 128
 
# 不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis会根据选定的回收策略(参见:maxmemmory-policy)删除key。
#
# 如果因为删除策略问题Redis无法删除key,或者策略设置为 "noeviction",Redis会回复需要更多内存的错误信息给命令。
# 例如,SET,LPUSH等等。但是会继续合理响应只读命令,比如:GET。
#
# 在使用Redis作为LRU缓存,或者为实例设置了硬性内存限制的时候(使用 "noeviction" 策略)的时候,这个选项还是满有用的。
#
# 警告:当一堆slave连上达到内存上限的实例的时候,响应slave需要的输出缓存所需内存不计算在使用内存当中。
# 这样当请求一个删除掉的key的时候就不会触发网络问题/重新同步的事件,然后slave就会收到一堆删除指令,直到数据库空了为止。
#
# 简而言之,如果你有slave连上一个master的话,那建议你把master内存限制设小点儿,确保有足够的系统内存用作输出缓存。
# (如果策略设置为"noeviction"的话就不无所谓了)
#
# maxmemory <bytes>
 
# 内存策略:如果达到内存限制了,Redis如何删除key。你可以在下面五个策略里面选:

# volatile-lru -> 根据LRU算法生成的过期时间来删除。
# allkeys-lru -> 根据LRU算法删除任何key。
# volatile-random -> 根据过期设置来随机删除key。
# allkeys->random -> 无差别随机删。
# volatile-ttl -> 根据最近过期时间来删除(辅以TTL)
# noeviction -> 谁也不删,直接在写操作时返回错误。

# 注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。
#
#       这里涉及的命令:set setnx setex append
#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
#       getset mset msetnx exec sort
#
# 默认值如下:
#
# maxmemory-policy volatile-lru
 
# LRU和最小TTL算法的实现都不是很精确,但是很接近(为了省内存),所以你可以用样例做测试。
# 例如:默认Redis会检查三个key然后取最旧的那个,你可以通过下面的配置项来设置样本的个数。
#
# maxmemory-samples 3
 
############################## 纯累加模式 ###############################
 
# 默认情况下,Redis是异步的把数据导出到磁盘上。这种情况下,当Redis挂掉的时候,最新的数据就丢了。
# 如果不希望丢掉任何一条数据的话就该用纯累加模式:一旦开启这个模式,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件。
# 每次启动时Redis都会把这个文件的数据读入内存里。
#
# 注意,异步导出的数据库文件和纯累加文件可以并存(你得把上面所有"save"设置都注释掉,关掉导出机制)。
# 如果纯累加模式开启了,那么Redis会在启动时载入日志文件而忽略导出的 dump.rdb 文件。
#
# 重要:查看 BGREWRITEAOF 来了解当累加日志文件太大了之后,怎么在后台重新处理这个日志文件。
 
appendonly no
 
# 纯累加文件名字(默认:"appendonly.aof")
# appendfilename appendonly.aof
 
# fsync() 请求操作系统马上把数据写到磁盘上,不要再等了。
# 有些操作系统会真的把数据马上刷到磁盘上;有些则要磨蹭一下,但是会尽快去做。
#
# Redis支持三种不同的模式:
#
# no:不要立刻刷,只有在操作系统需要刷的时候再刷。比较快。
# always:每次写操作都立刻写入到aof文件。慢,但是最安全。
# everysec:每秒写一次。折衷方案。
#
# 默认的 "everysec" 通常来说能在速度和数据安全性之间取得比较好的平衡。
# 如果你真的理解了这个意味着什么,那么设置"no"可以获得更好的性能表现(如果丢数据的话,则只能拿到一个不是很新的快照);
# 或者相反的,你选择 "always" 来牺牲速度确保数据安全、完整。
#
# 如果拿不准,就用 "everysec"
 
# appendfsync always
appendfsync everysec
# appendfsync no
 
# 如果AOF的同步策略设置成 "always" 或者 "everysec",那么后台的存储进程(后台存储或写入AOF日志)会产生很多磁盘I/O开销。
# 某些Linux的配置下会使Redis因为 fsync() 而阻塞很久。
# 注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们的 write(2) 请求。
#
# 为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止 fsync()。

# 这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。
# 这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定)

# 如果你有延迟的问题那就把这个设为 "yes",否则就保持 "no",这是保存持久数据的最安全的方式。
no-appendfsync-on-rewrite no
 
# 自动重写AOF文件
#
# 如果AOF日志文件大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。

# 工作原理:Redis记住上次重写时AOF日志的大小(或者重启后没有写操作的话,那就直接用此时的AOF文件),
#           基准尺寸和当前尺寸做比较。如果当前尺寸超过指定比例,就会触发重写操作。
#
# 你还需要指定被重写日志的最小尺寸,这样避免了达到约定百分比但尺寸仍然很小的情况还要重写。
#
# 指定百分比为0会禁用AOF自动重写特性。
 
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
 
################################## 慢查询日志 ###################################
 
# Redis慢查询日志可以记录超过指定时间的查询。运行时间不包括各种I/O时间。
# 例如:连接客户端,发送响应数据等。只计算命令运行的实际时间(这是唯一一种命令运行线程阻塞而无法同时为其他请求服务的场景)

# 你可以为慢查询日志配置两个参数:一个是超标时间,单位为微妙,记录超过个时间的命令。
# 另一个是慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。
#
# 下面的时间单位是微秒,所以1000000就是1秒。注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。
slowlog-log-slower-than 10000
 
# 这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。(译者注:日志居然是在内存里的Orz)
slowlog-max-len 128
 
################################ 虚拟内存 ###############################
 
### 警告!虚拟内存在Redis 2.4是反对的。
### 非常不鼓励使用虚拟内存!!
 
# 虚拟内存可以使Redis在内存不够的情况下仍然可以将所有数据序列保存在内存里。
# 为了做到这一点,高频key会调到内存里,而低频key会转到交换文件里,就像操作系统使用内存页一样。
#
# 要使用虚拟内存,只要把 "vm-enabled" 设置为 "yes",并根据需要设置下面三个虚拟内存参数就可以了。
 
vm-enabled no
# vm-enabled yes
 
# 这是交换文件的路径。估计你猜到了,交换文件不能在多个Redis实例之间共享,所以确保每个Redis实例使用一个独立交换文件。
#
# 最好的保存交换文件(被随机访问)的介质是固态硬盘(SSD)。
#
# *** 警告 *** 如果你使用共享主机,那么默认的交换文件放到 /tmp 下是不安全的。
# 创建一个Redis用户可写的目录,并配置Redis在这里创建交换文件。
vm-swap-file /tmp/redis.swap
 
# "vm-max-memory" 配置虚拟内存可用的最大内存容量。
# 如果交换文件还有空间的话,所有超标部分都会放到交换文件里。
#
# "vm-max-memory" 设置为0表示系统会用掉所有可用内存。
# 这默认值不咋地,只是把你能用的内存全用掉了,留点余量会更好。
# 例如,设置为剩余内存的60%-80%。
vm-max-memory 0
 
# Redis交换文件是分成多个数据页的。
# 一个可存储对象可以被保存在多个连续页里,但是一个数据页无法被多个对象共享。
# 所以,如果你的数据页太大,那么小对象就会浪费掉很多空间。
# 如果数据页太小,那用于存储的交换空间就会更少(假定你设置相同的数据页数量)
#
# 如果你使用很多小对象,建议分页尺寸为64或32个字节。
# 如果你使用很多大对象,那就用大一些的尺寸。
# 如果不确定,那就用默认值 :)
vm-page-size 32
 
# 交换文件里数据页总数。
# 根据内存中分页表(已用/未用的数据页分布情况),磁盘上每8个数据页会消耗内存里1个字节。
#
# 交换区容量 = vm-page-size * vm-pages
#
# 根据默认的32字节的数据页尺寸和134217728的数据页数来算,Redis的数据页文件会占4GB,而内存里的分页表会消耗16MB内存。
#
# 为你的应验程序设置最小且够用的数字比较好,下面这个默认值在大多数情况下都是偏大的。
vm-pages 134217728
 
# 同时可运行的虚拟内存I/O线程数。
# 这些线程可以完成从交换文件进行数据读写的操作,也可以处理数据在内存与磁盘间的交互和编码/解码处理。
# 多一些线程可以一定程度上提高处理效率,虽然I/O操作本身依赖于物理设备的限制,不会因为更多的线程而提高单次读写操作的效率。
#
# 特殊值0会关闭线程级I/O,并会开启阻塞虚拟内存机制。
vm-max-threads 4
 
############################### 高级配置 ###############################
 
# 当有大量数据时,适合用哈希编码(需要更多的内存),元素数量上限不能超过给定限制。
# 你可以通过下面的选项来设定这些限制:
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
 
# 与哈希相类似,数据元素较少的情况下,可以用另一种方式来编码从而节省大量空间。
# 这种方式只有在符合下面限制的时候才可以用:
list-max-ziplist-entries 512
list-max-ziplist-value 64
 
# 还有这样一种特殊编码的情况:数据全是64位无符号整型数字构成的字符串。
# 下面这个配置项就是用来限制这种情况下使用这种编码的最大上限的。
set-max-intset-entries 512
 
# 与第一、第二种情况相似,有序序列也可以用一种特别的编码方式来处理,可节省大量空间。
# 这种编码只适合长度和元素都符合下面限制的有序序列:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
 
# 哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表)。
# redis所用的哈希表实现(见dict.c)采用延迟哈希刷新机制:你对一个哈希表操作越多,哈希刷新操作就越频繁;
# 反之,如果服务器非常不活跃那么也就是用点内存保存哈希表而已。

# 默认是每秒钟进行10次哈希表刷新,用来刷新字典,然后尽快释放内存。
#
# 建议:
# 如果你对延迟比较在意的话就用 "activerehashing no",每个请求延迟2毫秒不太好嘛。
# 如果你不太在意延迟而希望尽快释放内存的话就设置 "activerehashing yes"。
activerehashing yes
 
################################## 包含 ###################################
 
# 包含一个或多个其他配置文件。
# 这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。
# 包含文件特性允许你引人其他配置文件,所以好好利用吧。
#
# include /path/to/local.conf
# include /path/to/other.conf    

Redis 发布和订阅

        Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。
        Redis客户端可以订阅任意数量的频道。
        一般用kafaka或者MQ,Redis的发布订阅一般不用。

操作 

        订阅者:SUBSCRIBE channell 订阅channell
        发布者:publish channell liang 向channell发布liang的信息

        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值