Redis学习笔记

Redis的应用场景:

缓存系统:

Redis在其中充当缓存的角色。用户访问服务器,服务器会先从缓存中获取,如果缓存中有数据,会直接返回给服务器。如果缓存中没有则缓存会从数据源(storage)中获取数据,为了下一次的使用,数据源会将数据存入缓存中,并将数据返回给服务器。

计数器:

利用redis的高效率来做微博或者视频网站的计数器,记录像转发数,播放数等。

消息队列系统:

redis提供了发布订阅,阻塞队列等功能,可以用来实现简单的消息队列系统。

排行榜:

redis提供了一个有序集合,有利于实现排行榜功能。

社交网络:

粉丝数,关注数,共同关注等都可以使用redis来实现

实时系统:

垃圾邮件处理,过滤器等功能可以用位图来实现过滤功能。

Redis的安装

sudo wget http://download.redis.io/releases/redis-3.2.6.tar.gz
sudo tar -zxvf redis-3.2.6.tar.gz
ln -s redis-3.2.6 redis
sudo make && sudo make install

redis-server:启动Redis服务器

redis-cli:Redis命令行客户端

redis-benchmark:Redis性能测试工具

redis-check-aof:AOF文件修复工具

redis-check-dump:RDB文件检查工具

redis-sentinel:启动sentinel服务器

Redis的三种启动方法:

最简启动:redis-server

动态参数启动:redis-server --port 6380

配置文件启动:redis-server configPath

 

三种方式比较:

生成环境选择配置启动,对于单机多实例的配置文件则可以用端口区分开

 

Redis客户端返回值:

状态回复:发送ping,会回复一个pong

错误回复:会返回系统错误

整数回复:对键值对进行计数

字符串回复:get操作取值,会返回字符串;mget取值则会返回多行字符串,即一行命令可以取出多个值

Redis常用配置:

daemonize:是否以守护进程方式启动redis(no|yes),默认值是no,推荐用yes

port:Redis的端口号,默认是6379

logfile:redis的系统日志

dir:redis的工作目录,也就是文件存储目录

Redis通用命令:

keys:获取redis数据库中的键,这个命令一般不在生产环境中使用。主要在热备从节点,scan中使用

dbsize:获取数据库大小,redis内部有一个计数器,所以每次获取不用全部查找,不用担心效率问题。

exists key:判断一个key是否存在,O(1)操作

del key[key...]删除多个key,删除成功返回1,如果key不存在删除失败返回0

expire key seconds:设置key的过期时间,key在seconds秒后过期;ttl key:查看key剩余的过期时间,-2表示已过期,数据不存在,-1表示数据存在且没有过期时间;persist key:去掉key的过期时间

type key:获取key的数据类型,string字符串类型,set集合类型,zset有序集合,hash哈希,list列表,none为key不存在的返回值.

 

Redis是单线程的为什么这么快?

1.redis是纯内存的,数据都是存在内存中的,绝大部分的操作都是内存操作,所以速度非常快。

2.redis使用多路I/O复用模型,非阻塞IO。所谓多路I/O复用也就是多个网络连接重复使用同一个线程,所以可以减少IO时间消耗,提升单线程的工作效率。

3.单线程可以避免线程切换和竞态消耗。也就是不存在多进程和多线程中切换消耗cpu资源,同时也不用考虑各种锁的问题,也就没有死锁出现的课程

 

String类型api

get取值,set设置值,del删除值

incr key:key自增1,如果key不存在,则从0开始自增并新建一个key,即key=1

decr key:key自减1,如果key不存在,则从0开始自减并新建一个key.即key=-1

incrby key k:key自增k,如果key不存在,则从0开始自增并新建一个key,即key=k

decrby key:key自减1,如果key不存在,则从0开始自减并新建一个key.即key=-k

获取数据源在mysql中缓存文件的基本信息:用户访问服务器通关文件id获取文件信息,服务器会先从redis中查找文件,如果redis中存在则直接返回给服务器,如果不存在则访问mysql获取文件信息将结果返回给用户,同时回写到redis中,为下次访问节省时间。

 

set命令:

set key value:不管key是否存在,都设置值

setnx key value:key不存在时,才设置值

set key value xx:key存在时,才设置值

mget,mset:批量进行get,set操作,其中mget是原子操作,(所谓原子操作也就是业务逻辑不可拆分,要么都成功,要么都失败),mget,mset这样的命令是将n条命令一次批量传给服务端,相较于n次的get,set命令可以节省大量的网络时间

 

getset key newvalue:将key设为newvalue,并返回旧的value值

append key value:在旧的value值后面添加上value值

strlen key:获取字符串长度,O(1)操作,中文占2个字符

incrbyfloat key value:浮点数的自增操作,增加value.

getrange key start end:获取字符串指定下标所有的值,类似于切割字符串获取值

setrange key index value:设置指定下标对应的值

 

哈希类型简介:

哈希的键值类型为key field value.

哈希的key类似于关系型数据库中表的一行.

哈希类型api:

hget key field:获取hash key对应的field的value.

hset key field value:设置hash key对应的field的value

hdel key field:删除hash key 对应的field的value.

hexists key field:判断hash key是否有field

hlen:获取hash key的field的数量

hmget key field1 field2 ... field n:批量获取hash key对应的field的value.

hmset key field1 value1 field2 value2 ... field n value n:批量设置hash key对应的field的value

 

hgetall key 返回hash key对应所有的field和value

hvals key 返回hash key对应所有的field的value(这个获取的是value)

hkeys key 返回hash key对应所有的field

上面三个是O(n)操作

hsetnx key field value:设置hash key 对应field的value(如果field存在,则设置失败)

hincrby key field int Counter:hash key对应的field的value自增intCounter

hincrbyfloat key field floatCounter:hash key对应的field的value自增floatCounter(浮点数)

posted @ 2018-09-22 22:41  shhy  阅读(116)  评论(0编辑  收藏  举报