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
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
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
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
4.2.7 decr
4.2.8 incrby / decrby
4.2.9 mset
4.2.10 mget
4.2.11 msetnx
4.2.12 getranger
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
4.3.8 lrem
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
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
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
4.5.3 hmset
4.5.4 hexists
4.5.5 hkeys
4.5.6 hvals
4.5.7 hincrby
4.5.8 hsetnx
4.5.9 hvals
4.6 Zset
- Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的所有成员都关联了一个评分(score),这个评分(score)被用来按照从低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。
- 因为元素是有序的,所有你也可以很好的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个美誉重复成员的只能列表。
4.6.1 zadd
4.6.2 zrange
- 返回有续集key中,下标在
之间的元素 - 带 WITHSCORES,可以让分数一起和值返回到结果集
4.6.3 zrangebyscore
- 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列
4.6.4 zrevrangebyscore
4.6.5zincrby
4.6.6 zrem
4.6.7 zcount
4.6.8 zrank

浙公网安备 33010602011771号