1.什么是redis?
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo(萨尔瓦托尔·桑菲利波) 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
2.redis的优势?
性能极高,读写快;支持多种数据类型;原子性,要么全部成功要么全部失败;丰富的特性如:支持订阅、发布和key过期等;
3.redis 的安装和使用;
1.下载地址
Windows 下安装
下载地址:https://github.com/tporadowski/redis/releases。
选择:
2.下载后安装到本地
我的位置在C盘,执行命令:
cd C:\redis
redis-server redis.windows.conf
如果报:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 是因为没有设置密码
第一步:打开我们的redis文件夹 找到redis-cli 点击运行 后
127.0.0.1:6379>auth “123456”
127.0.0.1:6379>shutdown
not connected>exit
问题解决;
4. 关于 常用的5种数据类型的用法?
redis 启动成功后,我们再打开一个cmd的窗口 执行以下命令:
redis-cli.exe -h 127.0.0.1 -p 6379
类型一String语法:
set myKey abc
get myKey
类型二Hash语法:
HMSET runoob field1 “Hello” field2 “World” field3 “World1”
HGET runoob field1
HGET runoob field2
HGET runoob field3
适合存储对象;
类型三List语法:
DEL runoob
lpush runoob redis
lpush runoob mongodb
lpush runoob rabbitmq
lrange runoob 0 1
类型四sets语法:
sadd runoob value 无序 value不能重复
去重;
类型五zset(sorted set:有序集合)
语法:zadd key score member 根据score 进行排序,可重复。 member 不允许重复
去重,且排序;
5、为什么redis可以采用单线程?
因为redis 是基于内存操作的,不依赖于cpu;cpu不再是redis的瓶颈,而内存的取决于机器的内存大小或者网络带宽,而在内存中读、写速度都比较快,所以没必要使用多线程;
6、怎么实现redis高可用集群?
单机情况下 redis 支持一万到几万的QPS(每秒查询率),但是如果遇到10万以上,甚至上亿的QPS这时候就需要用到redis集群(Redis Cluster);而实现redis高可用集群利用分区规则:Redis Cluster采用虚拟槽(slot)进行数据分区,即使用分散度良好的哈希函数把所有键映射到一个固定范围的整数集合里,这里的整数就是槽(slot)。Redis Cluster槽的范围是0~16383,计算公式:slot=CRC16(key) & 16383。(CRC16是一种高质量的哈希算法,可以使每个槽所映射的键通常比较均匀。)
7、redis本地订阅/发布?
一. 本地cmd实现订阅/发布
1.本地redis开启;
2.打开一个新的窗口作为订阅方,执行SUBSCRIBE runoobChat 订阅渠道为"runoobChat ";
3.再重新打开一个窗口作为发布方,执行PUBLISH runoobChat “Redis PUBLISH test”;
这时订阅方 就会收到发布方 发布的消息;
二. Java代码实现订阅/发布
- java项目中添加Jedis.jar依赖,
- 通过Jedis jedis=new Jedis(“localhost”)对象来连接 redis(生产环境使用JedisPool);
- jedis.publish(“channel”, “hello world”);进行发布消息
- 创建一个类ReceiveNews 继承JedisPubSub,并重写onMessage(String channel, String message);
- 这时通过Jedis jedis = new Jedis(“localhost”);
jedis.subscribe(new ReceiveNews (), “channel”);//进行订阅channel
2、redis为什么采用hash slot、而不用一致性hash算法?
3、redis分布式锁存在什么问题?怎么解决?
5、怎么解决热点数据问题?
6、 有哪些内存淘汰的方式?
7、 怎么解决内存横向扩展的问题?
8、在Redis集群模式下,如何进行批量操作?
9、是否有必要Redis集群模式不做读写隔离?