redis的数据类型:
String(字符串)
string是redis最基本的类型,一个key对应一个value
string类型是二进制安全的。意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
一个redis中字符串value最多可以是512M
Hash(哈希,类似java里的Map)
redis hash 是一个键值对集合
redis hash 是一个string类型的field 和 value 的映射表,hash特别适合用于存储对象,类似Java里面的MAP<String,Object>
List (列表)
redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或尾部,它的底层实际是个链表
Set (集合)
redis 的Set 是string类型的无序集合,它是通过HashTable实现的
Zset (sorted set:有序集合)
redis zset 和set 一样也是string类型元素集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的 排序。zset的成员是唯一的,但分数(score)却可以重复
redis常见数据类型操作命令:http://redisdoc.com/
redis的基本指令
redis是单进程的默认16个数据库,类似于数组,下标从0开始,一直到15,初始默认使用0号数据库。
select命令 可以切换数据库:
数据库之间不互通,例如我在0号库设置了一个键值对,切换到其他库之后并不适用:
Dbsize 查看当前数据库的key的数量:
keys * 查看所有的key:
keys k? 查看所有以k为开头并且键名长度为2的key:(一个?占一个位置)
如果库中有键名为k22的key,则使用keys k?则找不到这条,需要使用k??:
flushdb:清空当前库
fflushall:通杀全部库
统一的密码管理,16个库都是同样密码,要么都能进去,要么都进不去。
redis索引都是从0开始
redis 键(key)的基本操作指令:
keys * (查看当前库中所有的键)
exists 键名 (判断某个key是否存在),返回1表示key存在,返回0表示key不存在
move key db (将某个key移动到某个db)
ttl key 查看还有多少秒过期,-1 表示永不过期,-2表示已过期
expire key 秒钟: 为给定的key设置过期时间
我们给k3设置10秒的存活时间,10秒过去后k3将会被自动删除
type key 查看你的key是什么类型
del key 删除一个key
persist key 移除key的过期时间,key将长久保持
redis string 基本操作指令:
redis string 是单键单值的
set/get/del/append/strlen (设置/获取值/删除/给value尾部增加值/获取value长度)
Incr/decr/incrby/decrby (自增/自减/相加/相减)一定要是数字才能进行加减
getrange/setrange (获取指定区间范围内的值,类似between ... and 的关系/设置指定区间范围内的值,格式是setrange key 值 value) 0到-1表示全部
setex(set with expire)键秒值(设置key的时候顺便设置key的存活时间)/setnx(set if not exist,如果key不存在就创建,否则就不创建)
mset/mget/msetnx(一次创建多个键值对/一次获取多个值/如果每个key都不存在,则创建,否则不创建)
getset(先get再set)
redis 列表 基本操作指令:
单键多值
lpush/rpush/lrange (左添加 每一个value都添加到上一个value的左边 /右添加 每一个value都添加到上一个value的右边 /读取)
lpop/rpop (从左到右依次把value弹出/从右到左依次把value弹出)
lindex,按照索引下标获得元素
llen 获得key对应的value的个数:
lrem key :
ltrim key 开始index 结束index ,截取指定范围的值后再赋值给key:
rpoplpush 源列表 目的列表 (从源列表中rpop一个值然后lpush给目的列表):
lset key index value (把列表中某一个索引的值设置为另一个值)
linsert key before/after 值1 值2 给列表里的值1 前面/后面 插入值2
list性能总结:
它是一个字符串链表,left,right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
链表的操作无论是头或者尾效率都极高,但假如是对中间元素进行操作,效率就很低了。
redis集合(set):
单键多值
sadd/smembers/sismember (添加一个集合 集合名 值 /显示集合所有的值/判断一个值是否在集合里面)
scard (获取集合里面的元素个数)
srem key value 删除集合中的元素
srandmember key 某个整数(随机出几个数,不输入的话,默认出一个数)
spop key (随机出栈)
smove key1 key2 在key1里某个值 (作用是将key1里的某个值移动到key2)
数学集合类(差集:sdiff;交集:sinter;并集:sunion)
sdiff 类似与求01集合与02集合的不同元素,01集合在前,02集合在后,则求出来的是01集合中与02集合不同的元素,反之亦然。
sinter求集合之间的交集,即求出多个集合中相同的元素。
sunion 求集合之间的并集,如上例,即求出set01集合与set02集合中所有的元素并不重复的输出。
redis哈希(Hash):
kv模式不变,但v是一个键值对:
hset/hget/hmset/hmget/hgetall/hdel
hlen 获得哈希的键值对个数
hexists key 判断在key里面的某个值的key有没有,有则输出1,没有则返回0:
hkeys/hvals (获得一个哈希key中所有的key/values):
hincrby N/hincrbyfloat N(使哈希key中的一个key自增N)
hsetnx key (输入一个哈希key,如果不存在,则成功,返回1,如果已经存在,则失败,返回0):
有序集合Zset(sorted set)
它就是在set的基础上加一个score值。
之前set是k1 v1 v2 v3
现在Zset就是k1 score1 v1 score2 v2。。。
然后就是它的一些基本指令:
zadd/zrange
zrangebyscore key 开始score 结束score
zrem key 某score下对应的value值,作用是 删除元素
zcard/zcount key score区间 /zrank key values值
zrevrank key values值 作用是逆序获得下标值
zrevrange key 开始序列 结束序列 (把有序集合逆序输出):
zrevrangebyscore key 开始score 结束score(作用是将score对应的value逆序输出):