• 35648

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

redis梳理

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/jsh/2019/0722/57187.html 1190000019828543

remote dictionary server远程字典服务器

C语言开发的
TCP协议读写
数据都存储在内存中,可达到10万个键值读写每秒。
支持持久化。
还可以限定数据占用的最大内存空间,数据量达到空间限制后会按一定的规则自动淘汰不需要的键。
除了缓存,还可以利用列表类型键实现队列,并支持阻塞读取。还有“发布/订阅”的消息模式,做分布式锁。
https://gist.github.com/348262 这是一个用redis实现的聊天室

单线程,对手Memcached支持多线程,但redis性能已经足够优异。
redis的优势是支持字符串以外的其他数据类型,还支持持久化。

redis快的原因

纯内存操作
单线程操作,避免了频繁的上下文切换
采用了非阻塞I/O多路复用机制
redis线程模型:
redis线程模型
redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。

服务环境

轻量级,一个空redis实例内存只有1MB左右。

第一个小数点后的数字是偶数的版本是稳定版
redis-benchmark 是redis性能测试工具
redis-check-aof 是AOF文件修复工具
redis-check-dump 是RDB文件检查工具

生产环境推荐使用脚本启动redis,使得redis能随系统自动运行。
将redis源代码目录utils里的redis_init_script脚本,拷贝到/etc/init.d目录中,重命名文件为redis_6379。
新建/etc/redis目录存放配置文件(6379.conf),新建/var/redis/6379文件夹存放redis持久化文件。

shutdown停止服务时,redis收到SHUTDOWN命令后会先断开所有客户端连接,然后根据配置执行持久化,最后完成退出。
使用kill也可以正常停止redis服务。

数据库

0-15一个16个库,默认使用第0号库。
redis不支持自定义数据库名,也不支持为每个库设置不同的密码。
数据库之间也不是完全隔离,FLUSHALL命令可以清空一个redis实例中所有库的数据。
所以这些数据库更像是一种命名空间,不适合存储不同应用程序的数据,可以存储不同环境如测试、生产环境的数据。

键值支持的数据类型:

String
value可以是String也可以是数字。一般做一些复杂的计数功能的缓存,还可以存储json化的对象,甚至是图片(二进制数据),最大容量是512MB(看具体版本)。
hash
注意不能嵌套其他的数据类型(其他的也是),字段值只能是字符串。
一般存放的是结构化的对象,使用对象类型:对象id构成键名,使用字段表示对象属性,字段值存放属性值。比较方便的操作其中的某个字段。不然使用多个string类型存储一个对象的不同属性会不好管理。
也可以存映射关系,如搭建博客网站时用散列类型存储文章缩略名slug和id之间的映射关系。
在做单点登录的时候,用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。
list
列表类型可以存储一个有序(指的是插入顺序)的字符串列表。
内部是双向链表。获取头部或尾部的topn会比较快。插入数据的速度也不会受已有数据数量的影响。
可以做简单的消息队列的功能。不同方向插入、弹出即可。
另外可以用列表类型存储id列表,利用分片获取命令,做基于redis的分页功能。
set
因为set堆放的是一堆不重复值的集合。内部是使用值为空的散列表实现的。最方便的是可以进行交集、并集、差集等运算。
sorted set
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。

还支持集合的交集、并集等集合运算

redis-cli操作

大小写不敏感

键值获取

查看当前库有哪些键KEYS (pattern)

clipboard.png
支持*?[]\x(表示匹配字符x,如匹配问好,就 KEYS \?)
需要遍历所有键,当数据量多时,不建议使用。

EXISTS (键名)判断一个键是否存在,存在则返回1,否则0。
DEL (键名,多个键空格隔开)删除键,返回值是删除的个数。
可以通过管道实现通配删除:redis-cli KEYS "user:*" | xargs redis-cli DEL删除所有以"user:"开头的键。或者redis-cli DEL 'redis-cli KEYS "user:*"'

TYPE (键名)获得键值的数据类型。

STRLEN (键名)获得键值的长度(中文的话,计算的是utf-8编码后的长度)。不存在,返回0。

键值设置

========string类型值
SET (键名) (值) 赋字符串类型值。项目中键的命名有个建议是对象类型:对象id:对象属性
GET (键名) 当键不存在时会返回空。

MSET (键名) (值) 可以设置多个键值。
MGET (键名) 当键不存在时会返回空。
clipboard.png

虽然没有整数类型,但也提供了用于整数操作的命令,如INCR
clipboard.png
常用于统计文章访问量等。

INCRBY (键名) (步长)递增非1的情况使用。如果要递增浮点数,使用INCRBYFLOAT
同样,INCR都可以换为DECR实现递减。

APPEND (键名) (带双引号的字符串)实现向键值末尾追加。若键不存在,则相当于在null里追加。

========hash类型值

HSET 键名 字段名 字段值 用来给hash类型数据赋值即插入(返回1),也可能是更新(返回0)。
HSETNX 键名 字段名 字段值与上面的区别是如果字段已经存在,不会执行返回0。
HGET 键名 字段名
HMSET 键名 (字段名1 字段值1) (字段名2 字段值2) (字段名3 字段值3)...
HMGET 键名 (字段名1) (字段名2) (字段名3) 同时获取多个字段值
HGETALL 键名 获取所有键值
HEXISTS 键名 字段名判断一个字段是否存在,存在则返回1,否则(以及键不存在时)返回0。

HINCRBY 键名 字段名 步长使指定字段的字段值增加指定的整数。不存在的键会自动被建立。

HDEL 键名 字段名1 2 3可以删除一个或多个字段,返回删除字段的个数。

HKEYS 键名HVALS 键名 分别获取该键的所有字段名和所有字段值。
HLEN 键名 获得该键名的字段数。

========list类型值
LPUSH 键名 值1 值2... 从左侧插入数据,RPUSH表示从右侧插入。返回该键的元素数量。
LPOP 键名 从列表左侧弹出一个元素。RPOP表示从右侧弹出。
LLEN 键名 返回列表中元素的个数。不存在返回0。
LRANGE 键名 起始索引 结尾索引 从左往右,获取列表分片,起始从0开始,而且包含两端的元素。索引为负值,如-1表示右边的第一个元素。
LRANGE 键名 0 -1可以获取列表中所有元素,另外若”起始索引“位置比”结尾索引“位置靠后,会返回空列表;”结尾索引“大于实际索引范围则会返回到列表最右边的元素为止。
LTRIM 键名 起始索引 结尾索引删除指定索引范围外的所有元素。

LREM 键名 个数 值 当”个数“>0时,会删除从左边数前"个数"个值为"值"的元素; 当”个数“=0时,会删除所有值为"值"的元素;当”个数“<0时,会删除从右边数前"个数"的绝对值个值为"值"的元素。返回实际删除的元素个数。

LINDEX 键名 索引 获取指定索引(从0开始,负数表示从右边开始计算最右是-1)的元素值。
LSET 键名 索引 值 设置指定索引的元素值。
LINSERT 键名 BEFORE|AFTER pivot value 从左到右找到值为pivot的元素,然后根据第二个参数BEFORE|AFTER将value插入到该值的前或后面。返回最后列表的元素的个数。

RPOPLPUSH source destination 从源列表RPOP一个元素,然后LPUSH到目标列表。返回这个元素的值。相当于一个队列操作。源和目标列表可以是同一个列表。

========set类型值
SADD 键名 元素1 元素2...增添一个或多个元素,键不存在自动创建。返回成功加入元素的个数。
SREM 键名 元素1 元素2...删除一个或多个元素,返回删除成功的个数。

SMEMBERS 键名返回集合中所有元素。
SISMEMBER 键名 元素 判断元素是否在集合中。存在返回1,不存在或键不存在时返回0。

SDIFF 键1 键2 键3...多集合的差集运算。
SINTER 键1 键2 键3...多集合的交集运算。
SUNION 键1 键2 键3...多集合的并集运算。

配置

CONFIG SET ...命令可以在不重启服务的情况下动态修改redis配置,如日志级别loglevel,是否开启持久化等,但也不支持所有的配置项。
CONFIG GET ...命令查看当前配置情况。

redis命令都是原子操作,无论多少个客户端同时连接,都不会出现脏读问题。

相关文章

暂住......别动,不想说点什么吗?
  • 全部评论(0
    还没有评论,快来抢沙发吧!