Redis

Redis

1.Redis的入门

  • redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  • Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便

2.Redis的安装

2.1Linux

2.1.1Redis安装

下载地址

make clean --仅仅是清除之前编译的可执行文件及配置文件。 

make distclean --要清除所有生成的文件。

Makefile --在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:

make --根据Makefile编译源代码,连接,生成目标文件,可执行文件。

make clean --清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

make install --将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。

make dist --产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

make distcheck --生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。

make distclean类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。

2.1.1.1将redis-5.0.7.tar.gz移动到/opt/目录下

2.1.1.2使用tar -xvzf redis-5.0.7.tar.gz解压到当前目录

tar -xvzf redis-5.0.7.tar.gz

2.1.1.3使用在redis-5.0.7目录下使用make命令

[root@localhost redis-5.0.7]# make

可能会遇到gcc not found的情况

[root@localhost redis-5.0.7]# yum install gcc
[root@localhost redis-5.0.7]# yum install gcc-c++

执行以上命令,来添加gcc,gcc-c++

2.1.1.4执行make file,make install

[root@localhost redis-5.0.7]# make distclean #要清除所有生成的文件。
[root@localhost redis-5.0.7]# make install --将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。。

2.1.1.5移动到/usr/local/bin目录下

[root@localhost redis-5.0.7]# cd /usr/local/bin
[root@localhost bin]# ll
total 32768
-rwxr-xr-x. 1 root root 4365583 Feb 15 21:36 redis-benchmark
-rwxr-xr-x. 1 root root 8124686 Feb 15 21:36 redis-check-aof
-rwxr-xr-x. 1 root root 8124686 Feb 15 21:36 redis-check-rdb
-rwxr-xr-x. 1 root root 4806775 Feb 15 21:36 redis-cli
lrwxrwxrwx. 1 root root      12 Feb 15 21:36 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8124686 Feb 15 21:36 redis-server
[root@localhost bin]# ./redis-server  #启动服务
[root@localhost bin]# ./redis-cli  #启动客户端

2.1.1.6redis的/bin/解释

redis-benchmark     --性能测试工具,可以在自己本子运行,看着自己本子性能如何(服务后启动起来后执行)
redis-check-aof		-- 修复有问题的AOF文件
redis-check-rdb		--修复有问题的dump.rdb
redis-cli			--客户端,操作入口
redis-sentinel -> redis-server	--Redis集群用
redis-server 		--Redis服务器启动命令

2.1.2启动文件配置

2.1.2.1备份redis.conf:拷贝一份到其他目录

2.1.2.2修改redis.conf文件将里面的daemonize no 改为 yes,让服务在后台启动

2.1.2.3启动命令: 执行redis-server /myredis/redis.conf

[root@localhost bin]# ./redis-server /myredis/redis.conf

2.1.2.4用客户端访问:redis-cli

[root@localhost bin]# ./redis-cli
  • 多个端口可以redis-cli -p 6379

3.Redis相关知识

3.1默认16个数据库,类似数组下标从0开始,初始默认使用0号库

使用命令select 来切换数据库。如:select 8

3.2统一密码管理,所有库都是同样密码,要么都OK要么一个也连接不上

3.3Redis是单线程+多路IO复用技术

​ 多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在统一个线程理执行,也可以启动线程执行(比如使用线程)

3.4串行 vs 多线程+锁 vs 单线程+多路IO复用(Redis)

4.Redis--5大数据类型

4.1 Key

4.1.1 key * 查询当前库的所有键

127.0.0.1:6379> keys *
1) "birth"
2) "age"
3) "name"

4.1.2 exists 判断某个键是否存在

127.0.0.1:6379> exists name
(integer) 1

4.1.3 type 查看键的类型

127.0.0.1:6379> type name
string

4.1.4 del 删除某个key

127.0.0.1:6379> del birth
(integer) 1

4.1.5 expire 为键值设置过期时间

127.0.0.1:6379> set status 0
OK
127.0.0.1:6379> expire status 1
(integer) 1
127.0.0.1:6379> exists status
(integer) 0
127.0.0.1:6379> keys *
1) "age"
2) "name"

4.1.6 ttl 查看还有多少秒过期,-1表示永不过期,-2表示已过期

127.0.0.1:6379> ttl status
(integer) -2
127.0.0.1:6379> ttl name
(integer) -1

4.1.7 dbsize 查看当前数据库的key的数量

127.0.0.1:6379> dbsize
(integer) 2

4.1.8 flushdb 清空当前库

127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0

4.1.9 flushall 通杀全部库

4.2 String

  • String 是Redis最基本的基本类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.
  • String 类型是二进制安全的,以为者Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
  • String 类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

4.2.1 set 添加键值对

127.0.0.1:6379> set 'age' 20
OK
127.0.0.1:6379> set 'birth' '1998-9-16'
OK
127.0.0.1:6379> set 'name' 'wdd'
OK
127.0.0.1:6379> keys *
1) "birth"
2) "age"
3) "name"

4.2.2 get 查询对应键值

127.0.0.1:6379> get 'name'
"wdd"

4.2.3 append 将给定的最佳到原值的末尾

127.0.0.1:6379> set 'var' 'test'
OK
127.0.0.1:6379> append var '123456'
(integer) 10
127.0.0.1:6379> get var
"test123456"

4.2.4 strlen 获得值的长度

127.0.0.1:6379> get name
"wdd"
127.0.0.1:6379> strlen name
(integer) 3

4.2.5 setnx 只有在key不存在的时设置key的值

127.0.0.1:6379> setnx 'test' '测试'
(integer) 1
127.0.0.1:6379> get test
"\xe6\xb5\x8b\xe8\xaf\x95"

4.2.6 incr 将key中储存的数字值增1,只能对数字操作,若果为空,新增值为1

4.2.7 decr 将key中存储的数字值减1,只能对数字值操作,如果为空,新增值为-1

4.2.8 incrby / decrby <步长> 将 中储存的数字值增减。自定义步长

4.2.9 mset ...... 同时设置一个或多个 key-value 对

4.2.10 mget ....... 同时获取一个或多个value

4.2.11 msetnx 同时设置一个或多个key-value键值对,当所有key都不存在

4.2.12 getranger <起始设置> <结束位置> 获得值的范围 ,类似java的substring

4.2.13 setranger <起始设置> 覆盖值,从起始位置开始

4.3 List

  • 单键多值
  • Redis 列表是简单的字符串列表,按照出入顺序排序。你可以添加一个元素到列表的头部()左边或者尾部(右边)
  • 它的底层实际是双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

4.3.1 lpush/rpush ......从左边/右边插入一个或多个值

127.0.0.1:6379>  lpush hobbys 'music' 'play' 'study'
(integer) 3

4.3.2 lpop/rpop 从左边/右边吐出一个值,值在键在,值亡键亡

127.0.0.1:6379> lpop hobbys 
"study"

4.3.3 rpoplpush 列表右边吐出一个值,插到列表左边

127.0.0.1:6379> rpoplpush hobbys h
"music"

4.3.4 lrange 按照索引下标获得元素(从左到右)

127.0.0.1:6379> lpush habby 'music' 'java' 'c++' 'C#' 'python'
(integer) 5
127.0.0.1:6379> lrange habby 0 4
1) "python"
2) "C#"
3) "c++"
4) "java"
5) "music"

4.3.5 lindx 按照索引下标后的元素(从左到右)

127.0.0.1:6379> lindex habby 2
"c++"

4.3.6 llen 获得列表长度

127.0.0.1:6379> llen habby
(integer) 5

4.3.7 linsert before 的前面插入

4.3.8 lrem 从左边删除n个value(从左到右)

4.4 Set

  • Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,有不希望出现重复数据时,set是一个含好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供。
  • Redis的Set是string类型的无序组合。它底层其实是个value为null的hash表,所以添加,删除,查找的复杂读都是O(1)。

4.4.1 sadd ....... 将一个或多个元素加入到集合中,重复的元素被忽略

127.0.0.1:6379> sadd lang 'java' 'php' 'html' 'vue.js' 'javascript' 'css' 'c++' 'c#' 'python'
(integer) 9

4.4.2 smembers 取出所有值

127.0.0.1:6379> smembers lang
1) "php"
2) "javascript"
3) "c#"
4) "vue.js"
5) "c++"
6) "html"
7) "java"
8) "css"
9) "python"

4.4.3 sismember 判断是否存在值,有返回1,没有返回0

127.0.0.1:6379> sismember lang 'java'
(integer) 1
127.0.0.1:6379> sismember lang 'test'
(integer) 0

4.4.4 scard 返回集合的元素个数

127.0.0.1:6379> scard lang
(integer) 9

4.4.5 srem 删除集合中的某个元素

127.0.0.1:6379> srem lang 'html' 'css' 'javascript'
(integer) 3

4.4.6 spop 随机从该集合中吐出一个值

127.0.0.1:6379> spop lang
"python"
127.0.0.1:6379> spop lang 3
1) "vue.js"
2) "c#"
3) "c++"
127.0.0.1:6379> smembers lang
1) "php"
2) "java"

4.4.7 srandmember 随机从该集合中取出n个值,不会从集合中删除

127.0.0.1:6379> srandmember lang 2
1) "php"
2) "java"
127.0.0.1:6379> smembers lang
1) "php"
2) "java"

4.4.8 sinter 返回两个集合的交集元素

127.0.0.1:6379> sadd baicai 'java' 'html' 'jsp' 'servlet' 'tomcat'
(integer) 5
127.0.0.1:6379> sadd twoke 'java' 'spring' 'springmvc' 'html' 'mybatis' 'jsp' 'servlet'
(integer) 7
127.0.0.1:6379> sinter baicai twoke
1) "jsp"
2) "servlet"
3) "java"
4) "html"

4.4.9 sunion 返回两个集合的并集元素

127.0.0.1:6379> sunion baicai twoke
1) "jsp"
2) "servlet"
3) "mybatis"
4) "html"
5) "springmvc"
6) "java"
7) "tomcat"
8) "spring"

4.4.10 sdiff 返回两个集合的差集元素

127.0.0.1:6379> sdiff baicai twoke
1) "tomcat"
127.0.0.1:6379> sdiff twoke baicai
1) "springmvc"
2) "spring"
3) "mybatis"

4.5 Hash

  • Redis hash是一个键值对集合
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • 类似Java里面的Map<String,Object>

4.5.1 hset 集合中的键赋值

4.5.2 hget 集合取出value

4.5.3 hmset 批量设置hash值

4.5.4 hexists 查看哈希表key中,给定域field是否存在

4.5.5 hkeys 列出该hash集合的所有field

4.5.6 hvals 列出该hash集合的所有value

4.5.7 hincrby 为哈希表key中的域field的值加上增量 increment

4.5.8 hsetnx 将哈希表key中的域field的值设置为value,当且仅当域field不存在

4.5.9 hvals 列出该hash集合的所有value

4.6 Zset

  • Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的所有成员都关联了一个评分(score),这个评分(score)被用来按照从低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。
  • 因为元素是有序的,所有你也可以很好的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个美誉重复成员的只能列表。

4.6.1 zadd ..... 将一个或多个 member元素及其 score 值加入到有序集key当中

4.6.2 zrange [WITHSCORES]

  • 返回有续集key中,下标在 之间的元素
  • 带 WITHSCORES,可以让分数一起和值返回到结果集

4.6.3 zrangebyscore [withscores] [limit offset count]

  • 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列

4.6.4 zrevrangebyscore [withscores] [limit offset count] 同上,改为从大到小排列

4.6.5zincrby 为元素的score加上增量

4.6.6 zrem 删除该集合下,指定值的元素

4.6.7 zcount 统计该集合,分数区间内的元素个数

4.6.8 zrank 返回改制在集合中的排名,从0开始

posted @ 2020-02-16 20:37  TwoKe  阅读(17)  评论(0)    收藏  举报