Redis学习
楔子
redis学习笔记。
1 Redis快速入门
Redis是一个Key-value存储系统,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合).这些数据类型都支持push/pop、add/remove及取交集并集和差集以及更丰富的操作,而且这些操作都是原子性的,再次基础上,redis支持不同方式的排序,与memacched一样,为了保证效率,数据都是缓存在内存中,区别是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
1.3.1 数据类型
作为key-value类型数据库,Redis也提供了键和键值(value)的映射关系,但是除了常规的数值或字符串,Redis的键值还可以是以下形式。
- List 列表
- Sets 集合
- Sorted sets 有序集合
- Hashes 哈希表
键值的数据类型决定了该键值支持的操作。Redis支持诸如列表、集合和有序集合的交集、并集、差集等高级原子操作,同时,如果键值的类型是普通数字,Redis则提供了自增等原子操作。
1.3.6 适用场合
1 取最新N个数据的操作
2 排行榜应用,取top N操作
这是以某个条件为权重,比如按次数排序,可以使用sorted set,将要排序的值设置成sorted set的score,将具体的数据设置成value, 只需执行一次ZADD即可
3 需要精准设定过期的时间的应用
4 计数器应用
Redis的命令都是原子性的,可以使用incr decr命令来构建计数器系统。
5 uniq操作
使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了。set会自动排重。
2 数据类型以及操作
2.2 string类型以及操作
string类型是二进制安全的。可以包含任何数据,比如JPG图片或者序列化的对象。从nebula实现来看strin可以看做byte数组,最大上限1G字节。
2.2.1 set
27.0.0.1:6379> set name CN
OK
127.0.0.1:6379>
2.2.2 setnx
如果之前的key有一个值,本次修改不生效
127.0.0.1:6379> setnx name dou
(integer) 0
2.2.3 setex|设置键值有效期
设置键值对的有效期
设置 key:value 有效期为10秒
127.0.0.1:6379> setex key 10 value
OK
127.0.0.1:6379> get key
"value"
2.2.4 setrange|设置key的value值得子字符串
127.0.0.1:6379> set mail my@163.com
OK
127.0.0.1:6379> setrange mail 3 qq.com
(integer) 10
127.0.0.1:6379> get mail
"my@qq.comm"
2.2.5 mset
一次设置多个key的值,成功返回OK表示所有值都设置了,失败返回0表示没有任何值被设置。
127.0.0.1:6379> mset name1 v1 name2 v2 namee3 v3
OK
2.2.6 msetnx
与上述相同,但不会覆盖已存在的key,如果返回0表示操作都会回滚,都不被执行。
2.2.7 get
2.2.8 getset|设置key的值,并返回key的旧值
127.0.0.1:6379> get name
"v1"
127.0.0.1:6379> getset name v2
"v1"
127.0.0.1:6379> get name
"v2"
127.0.0.1:6379>
2.2.9 getrange|获取指定key的value值得子字符串
127.0.0.1:6379> get mail
"my@qq.comm"
127.0.0.1:6379> getrange mail 0 3
"my@q"
#字符串下标是从0开始的
127.0.0.1:6379> getrange mail -5 -1
".comm"
#当下标超出字符串长度时,默认行为是同方向的最大下标
127.0.0.1:6379> getrange mail 3 100
"qq.comm"
127.0.0.1:6379>
2.2.10 mget
一次获取多个key的值,如果key不存在,返回nil
2.2.11 incr|incrby
对key的值做加加操作,如果int的值不是value会返回错误。
2.2.12 decr |decrby
2.2.13 append 给指定key的字符串追加value,返回新字符串值得长度
2.3 hashes类型和操作
Redis hash是一个string类型的field和value的映射表,它的添加、删除操作都是O(1)平均。
hash特别适合用于存储对象。相对于将对象的每个字段存成单个string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始使用zipmap来存储,
2.3.1 hset|hsetnx(如果字段存在返回0)
127.0.0.1:6379> hset myhash field1 hello
(integer) 1
2.3.2 hmset|同时设置多个field
127.0.0.1:6379> hmset myhash f1 v1 f2 v3
2.3.3 hget|获取指定的hash field
2.3.5 hmget|获取全部指定的hash field
2.3.6 hincrby
指定的hash field加上给定值
127.0.0.1:6379> hset myhash age 20
(integer) 1
127.0.0.1:6379> hget myhash age
"20"
127.0.0.1:6379> hincrby myhash age 8
(integer) 28
127.0.0.1:6379> hget myhash age
"28"
2.3.7 hexists
测试指定field是否存在
127.0.0.1:6379> hexists myhash name
(integer) 0
127.0.0.1:6379> hexists myhash age
(integer) 1
返回1 表示存在
2.3.8 hlen
返回指定hash的field数量
2.3.9 hkeys |返回hash的所有field|hvals 返回所有value
2.3.10 hgetall|获取某个hash全部的key value
2.4 list类型及操作
list是链表结构,主要功能是push pop获取一个范围的所有值等,操作中key理解为链表的名字。
Redis的list类型其实就是每一个子元素都是string类型的双向链表。链表的最大长度是(2的32次方)。可以通过push pop操作链表的头部或尾部添加删除元素。使得list即可用作栈,也有用作队列。
2.4.1 lpush|头部添加元素
在key对应的list开头添加字符串元素
127.0.0.1:6379> lpush mylist world hello rdis
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "rdis"
2) "hello"
3) "world"
127.0.0.1:6379>
2.4.2 rpush|尾部添加元素
127.0.0.1:6379> rpush mylist go
2.4.3 linsert|在特定位置之前或之后插入字符串元素
127.0.0.1:6379> lrange mylist 0 -1
1) "rdis"
2) "hello"
3) "world"
4) "go"
5) "hello"
127.0.0.1:6379> linsert mylist before hello there
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "rdis"
2) "there"
3) "hello"
4) "world"
5) "go"
6) "hello"
127.0.0.1:6379>
2.4.4 lset|设置list中指定下标的元素值
127.0.0.1:6379> lrange mylist2 0 -1
1) "one"
2) "tow"
3) "three"
4) "four"
127.0.0.1:6379> lset mylist2 0 go
OK
127.0.0.1:6379> lset mylist2 -2 goland
OK
127.0.0.1:6379> lrange mylist2 0 -1
1) "go"
2) "tow"
3) "goland"
4) "four"
127.0.0.1:6379>
2.4.5 lrem
从list中删除count个和value相同的元素
127.0.0.1:6379> lrange myl5 0 -1
1) "hello"
2) "hello"
3) "hello"
4) "hello"
5) "hello"
127.0.0.1:6379> lrem myl5 4 hello
(integer) 4
127.0.0.1:6379> lrange myl5 0 -1
1) "hello"
127.0.0.1:6379>
如果count=0 全部删除,小于0按从尾到头的顺序删除
2.4.6 ltrim
保留指定key的值范围内的数据
2.4.7 lpop|rpop从头部(尾部)删除并返回
2.4.8 llen|获取list的长度
2.5 set类型以及操作
set是集合,对集合的操作有删除添加,对多个集合求交并差等操作。
通过集合的并集 交集 差集 可以实现好友推荐和blog的tag功能。
2.5.1 sadd
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 0
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"
127.0.0.1:6379>
2.5.2 srem|删除名称为key的set中的元素member
127.0.0.1:6379> srem myset hello
(integer) 1
#没有元素是 返回0
127.0.0.1:6379> srem myset hello
(integer) 0
2.5.3 spop|随机删除并返回其中一个元素
2.5.4 sdiff|返回给定key与第一个key的差集
3 Redis常用命令
3.1 键值相关命令
3.1.1 keys
#返回所有key
keys *
#返回所有mylist开头的key
keys mylist*
3.1.2 exists|确定一个key是否存在
3.1.3 del
3.1.4 expire|设置一个key的过期时间
3.1.5 move
将key移动到指定数据库
3.1.6 rename
重命名key
3.1.7 type 返回值得类型
3.2 服务器相关命令
3.2.1 ping|测试连接是否存活
3.2.2 echo|在命令行打印一些内容
3.2.3 quit|退出连接
3.2.4 dbsize 返回当前数据库中key的数目
3.2.5 info|获取服务器相关信息和统计
3.2.6 config get|获取服务器配置信息
127.0.0.1:6379[2]> config get dir
1) "dir"
2) "/var/lib/redis"
127.0.0.1:6379[2]>
3.2.7 flushdb删除当前选择数据库中的所有key
3.2.8 flushall 删除所有数据库中的所有key
Redis 启动停止
## 启动redis-server,后台线程
$ redis-server /usr/local/redis/etc/redis.conf
## 启动成功
$ ps axu|grep redis
shoren 14948 0.0 0.0 2434840 760 s000 S+ 10:18上午 0:00.00 grep redis
shoren 14946 0.0 0.0 2452968 1492 ?? Ss 10:18上午 0:00.01 redis-server *:6379
## 关闭服务器
$ redis-cli shutdown
##关闭成功
$ ps axu|grep redis
shoren 14952 0.0 0.0 2435864 772 s000 S+ 10:19上午 0:00.01 grep redis
Redis生产环境配置
https://blog.csdn.net/min996358312/article/details/59247721
https://www.jianshu.com/p/8ce453340828
其他资料
Redis key设计
https://blog.csdn.net/babykakaluo/article/details/9822381