Redis 基础知识
1,Redis 概念
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps
2,Redis 单线程好处
代码更清晰,处理逻辑更简单
不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
不存在多进程或者多线程导致的切换而消耗CPU
所以redis线程是安全的
3,redis 的五种基本数据类型
String(字符串):String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int
127.0.0.1:6379> set name 'chris'
OK
127.0.0.1:6379> set age 20
OK
取值: get name
get age
List(列表)
127.0.0.1:6379> lpush dd dd
(integer) 1
127.0.0.1:6379> lpush dd aa
(integer) 2
127.0.0.1:6379> lpush dd cc
(integer) 3
127.0.0.1:6379> lpush dd ee
127.0.0.1:6379> LINDEX dd 0 取下标为0的元素
"ee"
取值范围 0-4
127.0.0.1:6379> lrange dd 0 4
1) "ee"
2) "cc"
3) "aa"
4) "dd"
Hash(字典)
Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
HMSET hashkey name "chris" description "handsome men" likes 27
取某个字段的值:
HGET hashkey name
Set(集合)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
127.0.0.1:6379> SADD runoobkey redis
(integer) 1
127.0.0.1:6379> SADD runoobkey chris
取值:返回所有的元素
127.0.0.1:6379> SMEMBERS runoobkey
1) "redis"
2) "chris"
Sorted Set(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
127.0.0.1:6379> ZADD sortset 1 redis
(integer) 1
127.0.0.1:6379> ZADD sortset 2 redis
(integer) 0
127.0.0.1:6379> ZADD sortset 3 redis
(integer) 0
127.0.0.1:6379> ZADD sortset 1 mongo
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> ZADD sortset 6 mongddo
(integer) 1