Redis是一个开源( BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。它支持多种类型的数据结构,如字符串( strings),散列( hashes),列表(lists),集合(sets),有序集合( sorted sets)与范围查询,bitmaps,hyperloglogs 和地理空间( geospatial )索引半径查询。Redis 内置了复制( replication) , LUA脚本( Lua scripting ),LRU驱动事件( LRU eviction) , 事务(transactions )和不同级别的磁盘持久化( persistence ),并通过Redis哨兵( Sentinel )和自动分区(Cluster )提供高可用性( high availability)。
1.基础知识
1)最基本的常用命令
redis默认配置了16个数据库,默认使用第0个.
可以使用select 命令切换 到其他数据库, 不用的库可以存不同的值
用dbsize查看当前库的大小:
set 和get 设置和获取一个key 的value
mset和mget:批量设置处理k-v对,如
mset k1 v1 k2 v2 k3 v2 #批量设置看k1,k2,k3
mget k1,k2,k3 #批量获取v1,v2,v3
keys * 查看当前库所有key:
flushdb 清空当前库
flushall 清空全部库
用exist 查看某个key是否存在(1是存在,0是不存在)
使用move 命令将当前库的某个key移动到其他库:
使用expire 命令设置某个key的过期时间,使用ttl 命令查看key的有效期
使用del 命令删除一个key
使用type 查看key的类型
更多命令可以看redis中国官网:Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)
2)Redis是单线程的(6.0之后才使用多线程)
Redis是很快的,官方表示, Redis是基于内存操作, CPU不是Redis性能瓶颈, Redis的瓶颈是根据机器的内存和网络带宽,所以既然可以使用单线程来实现,那就使用单线程了。
3)Redis为什么很快
首先多线程的服务器并不一定比单线程的服务器快,因为在多线程服务器中cpu要进行线程间的切换,即会进行上下文切换,会消耗很多时间,而单线程的服务器不用,其次cpu的速度>>内存>>硬盘,而redis是基于内存的,再加上使用单线程,所以非常快。
2.Redis常用五大数据类型
1)String
对string的操作,
append:追加到原string末尾,如果远string不存在,则新建一个string类型的key
strlen:返回指定key的string长度
incr、decr、incrby、decrby : 自增自减操作
getrange:截取字符串
setrange:字符串替换
setex:也可以设置key的有效时长
setnx:当指定的key不存在时就设置这个key的值,与setex常常一起使用
前面讲了批量的mset和mget,这里讲一下msetnx(这个是原子性的,只能一起成功和失败):
getset 命令:先get再set
2)list
在redis里面,我们可以把list玩成, 栈、队列、阻塞队列。所有的list命令都是用L开头的!
LPUSH :向list的头部插入一个key,返回push之后的list大小
LRANGE :按顺序获取指定位置的值
RPUSH :向list的尾部插入一个key,返回push之后的list大小
LPOP:从list头部取出一个key
RPOP :从list尾部去除一个key
LINDEX:获取指定key的指定下标的值
LLEN:返回list的长度(大小)
LREM:移除指定的值
LTRIM:通过下标截取到指定长度的list
RPOPLPUSH:移除列表尾的元素并插入到另一个列表头(RPOP和LPUSH的组合)
LSET:将list的指定下标处的值替换为另一个值(更新操作),前提是这个list存在且下标未越界
LINSERT: 指定的值前或后插入值
list类型:实际上是一个链表, before Node after,left , right 都可以插入值:
如果key不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在! .
在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点~
3)set 指令以s开头,set中不能重复值
SADD:在set中添加元素
SMEMBERS:查看所有元素
SISMEMBER:查看某个值是否存在于某个set中
SCARD:获取set集合中的元素个数
SREM:移除set集合中的某个值
SPOP:随机移除set集合中元素
SMOVE :将源集合的某个值移到另一个目的集合
SDIFF、SINTER、SUNION:集合处理
4)hash(哈希)key-map模型,其中map是key-value模型,命令以h开头
HSET:设置key的hash值,可以进行批量操作(批量操作在v4.0之前使用的是HMSET)
HGET:获取key的hash值
HGETALL:获取指定key的全部hash值,map中的key-value形式出现
HMGET:批量获取值
HDEL:删除指定key的hash值,可以批量操作
HLEN:获取指定key的哈希值数量
HEXISTS:判断指定key的hash中是否存在指定的字段
HKEYS:获取指定key的所有hash的key值,注意hash是:key-map型(map中是key-value型)
HVALS:获取指定key的所有hash的key->value值
HINCRBY、HDECRBY、HSETNX等操作和前面类似的
hash变更的数据user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的存储, String更加适合字符串存储!
5)zset 有序集合
ZSET k1 score1 v1... (可以批量操作)添加到k1的ZSET集合
ZRANGE key start stop 查看某些值(升序)
ZREVRANGE key start stop :返回从start到stop的按score降序结果
ZRANGEBYSCORE key min max [withscore]:按照key中的值从min到max升序排列返回,可以带上score值
ZREM key value 移除key中值为value的元素
ZCARD key :获取key的所有元素个数
ZCOUNT :获取指定区间的元素数量
其余的api可以看官方文档:Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)