Redis开发与运维 阅读笔记(上篇哈哈哈哈)

来吧,重点的先说http://redisdoc.com/ Redis命令参考

一、Redis 简单介绍

Redis 是一种键值对的NoSQL数据库。Redis中的值可以使string, hash,list,set,zset(有序集合),Bitmaps(位图),HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成。Redis会将所有数据都存放在内存中,读写性能惊人。Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,以使内存数据不会在故障时“丢失”。Redis 还提供键过期、发布订阅、事务、流水线、Lua脚本等附加功能。

前身今世 2008年Salvatore Sanfilippo在开发LLOOGG网站需要高性能的队列功能,发现MySQL不能满足性能要求,决定自己编写程序,也就是后来的Redis。

Redis是用C语言实现的。Redis使用单线程架构,预防了多线程可能发生的竞争问题。Redis 提供两种持久化方式:RDB和AOF。Redis提供了复制功能,是分布式Redis的基础。高可用:Redis Sentinel能够保证Redis节点的故障发现和故障自动转移。Redis从3.0版本提供了分布式实现Redis Cluster,提供了高可用、读写和容量的扩展性。

https://redis.io/

Redis 能做什么? 1.缓存 Redis提供了键值过期时间设置,并且提供灵活控制最大内存和内存溢出后的淘汰策略。2.排行榜系统 Redis 提供列表和有序集合数据结构;3.计数器应用 例如视频网站播放量,如果并发量很大时,对于传统关系型数据的性能是一种挑战,Redis天然支持计数功能;4.社交网络 传统的关系型数据不太适合保存这种类型的数据。;5.消息队列系统  业务解耦和非实时业务削峰。与专业的相比不高强大。

Redis 安装  我在Centos上面进行安装,

wget http://download.redis.io/releases/redis-3.0.7.tar.gz

tar xzf redis-3.0.7.tar.gz

ln -s redis-3.0.7 redis

cd redis

make

make install

如果在make语句不通过并报出错可以试试以下语句:首先需要安装一些工具 yum -y install wget         yum  -y install gcc    make MALLOC=libc(如果make出错的话)  

Redis 的启动  比较灵活的是配置文件启动。

一般不自己写配置文件,而是使用redis-3.0.7目录下的redis.conf文件作为模板,然后稍微修改成自定义配置。如下是配置文件的部分内容:利用redis-server /***(你的配置文件地址) 即可启动redis。

如何操作Redis?  使用redis-cli来操作Redis服务。

基本操作有两种方式:

第一种是交互式(我感觉挺好的):redis-cli -h {host}(自己的主机ip地址,默认不写-h这个配置项,则为本地127.0.0.1) -p {port}(自己配置redis服务的端口号,如果未进行配置,就是用默认端口,截图也表明,默认端口为6379)。

可以备份修改redis.conf文件将默认的daemonize no改为daemonize yes 此时可以使redis-cli 命令能够快速显示结果

Redis关闭服务

redis-cli shutdown

注意:版本号第二位如果为奇数,则是不稳定版,3.0.7就是稳定版

 

二、API的理解和使用

全局命令

1.查看所有键

keys *

2.键总数(Redis有内置键总数变量,所以时间复杂度为O(1),而keys 会遍历所有,时间复杂度为O(n))

dbsize

3.插入列表值

rpush mylist a b c d e f g

4.查询是否存在某键

exists mylist

5.删除键

del mylist

6.键过期(单位为秒)

expire mylist 10

7.查看键剩余过期时间

ttl mylist

8.查看键的数据结构类型

type mylist

9.查询某键的内部编码

object encoding mylist

list 两种内部编码为ziplist 和 linkedlist 。ziplist比较节省内存,如果在列表元素比较多的情况下,性能会有所下降,这时会Redis会选择linkedlist。

为什么Redis单线程仍能这么快?

1.纯内存访问;内存访问时长大约100ns;2.非阻塞IO;使用epoll作为I/O的多路复用技术,不在网络IO浪费过多时间;3.单线程避免了线程切换和竞态产生的消耗。

三、基本命令分类:(下面分析的都是键值对中的值的数据类型,要记住键都是字符串类型,所以只考虑值的类型)

内部编码共三个,int(8个字节的长整型),emberstr(小于等于39个字节的字符串)、raw(超过39个字节的字符串)

1.String字符串

字符串的值可以是字符串,json,xml,数字,二进制(图片,音频,视频)但是最大能存储512M。

来吧,常见命令格式

1.1 set key value [ex seconds] [px milliseconds] [nx|xx]

设置某个键值对的秒级过期时间,毫秒级过期时间。nx代表是必须键不存在才能设置成功(相当于添加功能),xx表示键必须存在才能设置成功(相当于修改功能)。

其他命令都是例如setex setxx都能猜出功能。这里说setnx的作用,是因为redis是单线程命令处理机制,如果有多个客户端同时执行setnx key value的话,根据setnx特性,只有一个客户端能设置成功。setnx可以作为分布式锁的一种实现方案 。msetnx应该也能想象到。

1.2 批量设置值

mset  key value [key value ...](如果key value 的key 已经设置过,则这个语句不能执行成功,必须未设置过的键才能保证整条语句成功完成。)

批量获取值

mget key [key ...]

mset是比set具有更高效的处理能力。如果数量过多可能造成Redis阻塞或网络拥塞。

1.3 计数

incr key 如果值是整数数字类型,则可以完成自增1操作,如果想自增其他数值可以使用incrby操作。decr 就是自减1操作,decrby key decrement就是key 的数值减少decrement量。话说Redis的小命令真多。incrbyfloat(自增浮点数)。

记住一句话“Redis是单线程架构,任何命令道了Redis服务器都要顺序执行,所以减少了一堆同步操作,增强数据一致性功能。

1.4追加字符串

append key value

1.5字符串长度

strlen key

记住中文字符在redis占用3个字节。

1.6设置并返回键原先的值

getset key value

1.7设置指定位置的字符

setrange key offset value 

redis的数组索引从0开始

getrange key start end 获取部分字符串,返回的字符串包含end,这个与java有一定的不同。

常见的字符串键值对的使用场景

1.典型使用场景--缓存

上图是常见的缓存存储架构

2.计数(比如一些视频播放量的功能实现,可以使用redis进行缓存视频播放量)

3.共享Session 

传统的分布式系统如下图,用户登录的Session 在各个Web服务器中不能共享,导致用户用到不同的Web服务需要重新登录的坏的用户体验,而使用Redis可以共享Session,减少用户的不适体验。

下图是Redis共享Session

3.限速

为了防止短信接口的频繁访问,可以设置合理的限速要求,比如一分钟不能发送超过5条的短信验证码信息。

2.hash

哈希的是键值对的结构,feild-value。

hset/hget/hmget/hgetall/hdel/hlen/hexists key /hkeys/hvals/hincrby /hincrbyfloat hsetnx

 

3.list

list是链表结构

lpush 是从左边插入 “l”代表left 左边,“r”代表right右边,pop是出栈操作,也就是列表删除此元素。

记住,左边的进都会将之前的往右移。

lrange 是进行输出list元素的操作,lrange list名称 0 -1代表从左边输出所有元素。

llen 是list的长度,lrem 是删除某个位置的元素,后面跟着删除的位置索引。
lindex 是list 的元素index所指的元素。

lrem 是删除多个相同值的元素,例如 lrem list01 2 3 是删除list01中的2个3。

ltrim 是截取指定范围的元素赋值给原先的列表。 相当于java中字符串的substring函数

rpoplpush 源列表 目的列表  就是指源列表的最右元素出栈 进入目的列表的最左端。

lset 是设置list列表中某个位置的元素设置为其他值。

linsert list名称 before|after  某个元素的值 插入在某个元素前面|后面的值。 例如 linsert list01 g ddd 就是在list01 的g元素前插入一个元素值为ddd。

4.set

sadd set名称 set元素值 (当有重复的元素,redis会自动过滤重复元素。)

smembers set名称,输出set里面的元素

sismember,查看某元素是否在某个set集合中。

scard 获取集合中有多少个元素

srem 删除元素中的某个元素

srandmember  set名称 随机元素个数 ,功能是随机选择元素

spop随机出栈

smove 源set集合 目标set集合 元素值 :将源set集合中的元素值移动到目标set集合中

sdiff set01 set02 :两个集合差集

sinter 求交集

sunion求并集

5.zset(给一个场景,游戏玩家的分值排行榜,值和分是一个整体所以分数可以重复,玩家名称可以不重复,这样可以更好地满足需求)

在set基础上,加一个score值

zadd/zrange   还可以带withscores/ zrangebyscore key(按分值搜索元素) 如果不包含 使用( 左半括号表示右边数值不包含,使用limit话表示开始下标 、步长

zrem 删除

zcard 统计个数

zcount 是统计分数范围内有多少个元素

zrank 是拿到某个元素的下标

zscore 是获取某个元素所对应的分值

zrevrank key value 是获取逆序后set中的key的下标值

zrevrange 与zrange 输出的相反

三、Redis 配置文件解析(很重要)

1k = 1000bytes 而1kb=1024bytes

includes 主要是包含其他配置文件,以减少redis.conf 总配置文件的长度。

General配置

下图 timeout设置客户端闲置多长时间后关闭连接 默认设置的0 表示不配置该关闭连接功能。也就是不管客户端是否闲置都不关闭。

设置密码 在redis-cli 环境下 命令 config set requirepass "123456"就可以设置密码,但是redis一般不启动密码,因为它认为自己做缓存,已经是高权利的任务,应该有其他服务提供安全。所以默认没有密码。如果设置为“”,则redis不启动密码验证

limits配置,配置一些大小数量限制

volatile-lru:使用LRU算法移除key,只对设置了过期时间的键

allkeys-lru:使用LRU算法移除key

volatile-random /allkeys-random自己猜一猜哈哈哈,随机移除key 

volatile-ttl:移除那些TTL值最小的key(ttl就是设置过期时间的元素的一个过期剩余时间属性值) 

noeviction:不进行移除,针对写操作,返回错误信息。就是不能动redis,所以生产中会影响反应性能的。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值