1、redis介绍
1.1、redis是一个开源的key-value存储系统
1.2、和Memcached类似,它支持存储的value类型相对很多,包括String、list、set、zset以及hash类型。
1.3、这些数据类型都支持push/pop、add/remove及取交集并集及更丰富的操作,而且这些操作都是原子性的
1.4、redis支持各种不同方式的的排序
1.5、数据存储在内存中
1.6、redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件
1.7、实现master-slave(主从)同步
2、redis安装
2.1、下载redislinux安装包
2.2、 解压文件
tar -zxvf redis-7.1.1.tar.gz
2.3、进入该目录下进行编译、安装
cd redis-7.1.1
make
make install
2.4、运行
进入/usr/local/bin目录下
修改redis.conf 配置后台启动开启 daemonize no 改称 yes
redis-server /redis.conf (后台运行)
3、常用数据类型
3.1、String
tring是Redis最基本的类型,且时二进制安全,意味着Redis的String可以包含任何数据(对象需要序列化)
String类型时Redis最基本的数据类型,一个Redis中字符串value最多可以时512M。
常用命令
1、 set key value
set k1 v100
set k2 v101
2、 get key 查询对应键值
3、 append key value 将给定的value追加到原值的末尾
4、 strlen key 获得值的长度
5、 setnx key value 只有在key不存在时 设置key的值
6、 incr key 将key中存储的数字值加1 如果为空 1
7、 decr key 将key中存储的数字值减1 如果为空 -1
8、 incrby/decrby key 步长 将key中存储的数字值增减
9、 mset key value key2 value2 key3 value3 对多个key value进行赋值
10、mget key key1 key3 等 同时获取一个或者多个key对应的值
11、msetnx key value key1 value1 同时设置一个或者多个 key-value时,当且今当所有的key都不存在时
12、getrange key startindex endindex 获得值的范围,类似java 的substring
13、setrange key startIndex endindex 设置key对应的value对应的值
14、setex key 过期时间 value 设置键值的同时,设置过期的时间,单位是秒
15、getset key value 获取到旧值,但是已经更新了 value
原子操作,这里的原子操作将不会被远程调度机制所打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何的context switch (切换到另一个现程)
1、在单线程中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断值发生在指令之间。
2、在多线程中,不能被其他线程打断的操作就叫做原子操作
3、String的数据结构为简单动态字符串,是可以修改的字符串,内部结构类似为java的arrayList,采用预分配冗余空间的方式来减少内存的频繁分配
3.2、列表 list
单键多值
1、Redis列表是简单的字符串列表,按照插入顺序排序,它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
常见命令
1、lpush/rpush key value1 value2 value3… 从左/右插入一个或者多个值。
2、lpop/rpop key 从左/右边吐出一个值 值在键在,值光键亡。
3、rpoplpush key1 key2 从key1列表右边吐出一个值,插到key2列表中的左边
4、lrang key start stop 按照索引下标获得元素(从左到右) 0 -1 取出所有的数据
5、lindex key index 按照索引下标获得元素(从左到右)
6、llen key 获得列表长度
7、linsert key before value newvalue 在value后面插入newvalue插入值
8、lrem key n value 从左边删除n个value(从左到右)
9、lset key index value 将列表key下标为index的值替换成value
List的数据结构为快速链表 quickList
3.3、 set
Redis set 对外提供的功能与list类是,是一个列表的功能,特殊之处在于set是可以自动去重,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。
常见命令
1、sadd key value value2 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略
2、smembers key 取出该集合的所有值
3、sismember key value 判断集合key 是否含有value ,有1 ,没有 0
4、 scard key 返回该集合的元素个数
5、srem key value value2… 删除集合中的某个元素
6、spop key 随机从集合中吐出一个值
7、srandmember key n 随即从该集合中取出n个值,不会从集合中删除。
8、smove source destination value 把结合中一个值从一个集合移动到另一个集合中
9、sinter key1 key2 返回两个集合的交集元素
10、sinter key1 key2 返回两个集合的并集元素
11、sunion key1 key2 返回两个集合的并集元素
12、sdiff key key1 返回两个集合中的差集元素,key中 不包含 key1中的
数据结构
1、set 数据结构是dict字典,字典是用哈希表来实现的。Java 中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也是使用hash结构,所有的value都指向同一个内部值。
3.4、 Redis 哈希(Hash)
Redis hash是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象。类是Java中的Map<String,Object>
常用命令
1、hset key field value 给key集合中的 field值赋为value
2、hget key field 从key 集合field取出value
3、hmset key field value field1 value1…批量设置hash的值
4、hexists key field 查看哈希表key中,给定域field是否存在
5、hvals key 列出该hash集合的所有的value
6、hkeys key列出该hash集合的所有的field
7、hincrby key field increment 为哈希表key中的域field 的值加上增量 1 -1
8、hsetnx key field value 将哈希表key中的域field的值设置为value,当且仅当域field不存在时。
数据结构
1、Hash类型对应的数据结构是两种:ziplist(压缩类表),hashtable(哈希表)。当field-value 长度较短且个数较少时,使用ziplist,否则使用hashtable。
3.5、 Redis 有序集合 Zset(sorted set)
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是为一的,但是评分可以是重复的,因为元素是有序的。所以可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
常用命令
1、zadd key score1 value1 score2 value2…将一个或多个member 元素及其score值加入到有序集合key当中
2、zrange key start stop withscores 返回有序集合key中,下标为 start、stop 之间的元素
3、带withscores,可以让分数一起和值返回到结果集
4、zrangebyscore key minmax withscores limit offset count 返回有序集合key中,所有score值介于min 和 max之间(都是闭合区间)的成员,有序集合成员按score值递增 排列
5、zrem key value 删除该集合下,指定值的元素
6、zincrby key increment value 为元素的score 加上增量
7、zrevrangebyscore key maxmin withscores limit offset count
参考: Redis连接