redis简介
内存中的非关系型数据库(nosql),以键值对KV的形式存储数据。
单线程:redis网络请求模块使用单线程来处理所有网络请求(所以无需担心线程安全问题),但redis其他工作模块照样是使用多线程。
速度快:redis数据存在于内存中,读写速度快;
单线程redis可完成10万次/秒的查询;
内部采用多路复用I/O,防止I/O阻塞影响效率,I/O影响redis速度,多路复用切换时比多线程I/O切换更省时间和资源。
redis多用于热数据的存储,读写响应快,准确性要求不是特别高的数据,如访问量;服务集群或是分布式的时候数据出现一致性等问题。
影响redis速度主要因素:I/O与redis之间的网络问题。
场景一:session丢失 集群系统登录访问Tomcat1,存储sessionId在tomcat1上,当再次访问服务,请求别分发到tomcat2中,此时并没有登录sessionId,会再次要求用户登录。
场景二:分布式锁 线程安全问题,当用户访问Tomcat1的中加锁的代码时,另外一个请求访问到tomcat2中同样的加锁代码,便会出现线程安全问题,此时需要将此代码的锁状态放在redis中。
key的命名规范
表名:主键名:主键值:字段名 如: user:id:s5d45tbtb1ts:age 18
数据类型
所有的key都是String 类型,value分String、List、Set、ZSet、Hash
ttl key(time to live) | key的剩余存活时间 |
keys * | 查看所有的key |
keys *a | 查看以a结尾的key |
del key | 删除key |
String
set k v/mset k1 v1 k2 v2 | 一次设置一个/多个k/v |
get k/mget k1 k2 | 一次获取一个/多个k的值 |
strlen k | 获取k的v的长度 |
append k | 在k的v后添加值 |
getset k | 获取k的v值并设置k的新值,v无值返回nil |
getrange key start end | 截取value内容,含头尾,对原值无影响 |
setex key seconds value | 设置k的值和k的生存时长(秒) |
psetex key milliseconds value | 设置k的值和k的生存时长(毫秒) |
setnx key value | 仅当key不存在时才执行set值操作 |
msetnx key value [key value ...] | 仅当所有key不存在时才执行set值操作 |
incr key/decr key | key的值加/减1 |
decrby/incrby key decrement | key的值加/减decrement (整数) |
incrbyfloat key increment | key的值加/减decrement (浮点数) |
List
有序可重复,类似Java中的List,list中的元素为String类型
lpush/rpush key value [value ...] | 将一个或多个值 value 插入到列表 key 的 表头 (表末),当key不存在时,新建并执行插入 |
lpushx/rpushx key value | 意思同上,区别是当 key 不存在时, LPUSHX/RPUSHX 命令什么也不做。 |
lpop/rpop key | 获取从表头(表末)的值(移除操作) |
llen key | 返回列表 key 的长度 |
lrange key start stop | 获取key指定下标区间的元素,下标从0开始, -1、-2代表倒数第一个和倒数第二个元素 |
lindex key index | 获取指定下标的元素,下标从0开始, -1、-2代表倒数第一个和倒数第二个元素 |
lset key index value | 将列表index位置的元素设置为value |
linsert key BEFORE|AFTER oldvalue value | 在list老值的前(后)插入新值value |
lrem key count value | 从列表中移除count个值等于value的元素 count>0,从头到尾删除count个, count=0,删除所有等于value的元素, count<0,从尾到头删除count绝对值个数的值等于value的元素 |
ltrim key start stop | 保留下标start到end的元素,其他的删掉 |
Set
无序不可重复
sadd key member [member ...] | 集合中添加一个或多个值,已存在的值忽略 |
smembers key | 返回集合key中所有元素 |
scard key | 返回集合key中的元素个数 |
spop key | 随机返回集中中的一个元素并移除 |
srem key member [member ...] | 删除指定的一个或多个元素 |
smove S1 S2 member | 将指定元素从一个集合移动到另一个集合中 (原集合元素member删除) |
srandmember key | 随机返回集合中的一个元素,和spop一样,只是没有移除操作 |
sismember key member | 判断集合中是否包含指定元素 |
sdiff key [key ...] | 获取 减去指定集合中共有元素后 的集合(差集) |
sinter key [key ...] | 求给定集合的交集 |
sunion key [key ...] | 求给定集合的并集 |
ZSet(Sorted Set)
有序不可重复集合
zadd key score member [ [score member] [socre member] ... ] | 将一个或多个元素及其score值加入到有序集合中(通过score排序,score可以是整数和双精度浮点数) |
zcard key | 返回集合元素个数 |
zrange key start stop [WITHSCORES] | 返回指定下标区间内的元素,元素的位置按score值从小到大排序,位置下标从0开始,-1:最后一个,-2:倒数第二个;加上WITHSCORES后联通score值一同返回 |
zrevrange key start stop [WITHSCORES] | 与zrange不同的是用倒序 |
zrangebyscore key min max [WITHSCORES] | 返回指定score范围内的元素(含头尾) |
zrank key member | 返回指定元素的排名(第几)(按score递增排序) |
zrevrank key member | 返回指定元素的排名(第几)(按score递减排序) |
zscore key member | 返回指定元素的score值 |
zcount key min max | 返回score值介于min和max值之间(包含)的元素数量 |
zincrby key increment member | 给指定的元素加减分,increment为整数或双精度浮点数 |
zrem key member [member ...] | 移除指定元素 |
Hash
hset key field value | 将哈希表 key 中的域 field 的值设为 value |
hget key field | 返回哈希表 key 中给定域 field 的值 |
hgetall key | 获取哈希表key中所有的域和值 |
hkeys key | 获取哈希表key中所有的域 |
hvals key | 获取哈希表key中所有的值 |
hdel key field [field ...] | 删除哈希表key中指定的一个或多个域 |
hexists key field | 查看哈希表 key 中,给定域 field 是否存在 |
hsetnx key field value | 当哈希表key中不存在此field时执行添加元素操作 |
hmset key field value [field value ...] | 往哈希表key中存入一个或多个域-值对 |
hmget key field [field ...] | 获取哈希表key中指定的一个或多个域的值 |
hlen key | 返回哈希表 key 中域的数 |
hincrby key field increment | 对指定field的值进行加减increment操作 |
hincrbyfloat key field increment | 对指定field的值进行浮点加减increment操作 |