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(浮点数)