2. Пять типов данных и сценарии использования Redis

Redis опрос
2. Пять типов данных и сценарии использования Redis

В Redis есть 5 основных структур данных, а именно: string (строка), list (список), set (набор), hash (хеш) и zset (упорядоченный набор).

Все структуры данных в Redis представляют собой ключ, соответствующий значению.Разница между различными типами структур данных заключается в структуре значения.Например, тип данных строки, его значение является строкой, а тип данных списка, его значение. значение представляет собой связанный список.

1.String

Строка Строка — это простейшая структура данных в Redis, которая может хранить строки, целые числа или числа с плавающей запятой. Наиболее распространенным сценарием приложения является кэширование объектов, например кэширование информации о пользователе, ключ — «userInfo»+#{идентификатор пользователя}, а значение — строка JSON объекта информации о пользователе.

Случай:

ключ: userInfo123

значение: {"пол":1,"псевдоним":"рыба Java-программы","userId":123}

Основные операции Redis со строками

127.0.0.1:6379> set name hzy # 设置
OK
127.0.0.1:6379> get name # 获取
"hzy"
127.0.0.1:6379> exists name  # 判断是否存在
(integer) 1
127.0.0.1:6379> del name # 删除
(integer) 1
127.0.0.1:6379> get key
(nil)

Пакетные операции Redis String

Вы можете считывать и записывать несколько строк в пакетах, экономя время сети и накладные расходы.

127.0.0.1:6379> mset name1 xiaoming name2 xiaohong # 批量设置
OK
127.0.0.1:6379> mget name1 name2 # 批量获取
1) "xiaoming"
2) "xiaohong"

Операция подсчета строк Redis

Если value является целым числом, мы можем автоматически увеличивать его. Саморост имеет диапазон, и его диапазон — это максимальное и минимальное значения signed long, при превышении этого значения Redis сообщит об ошибке.

127.0.0.1:6379> incr likenum # 自增1
(integer) 1
127.0.0.1:6379> get likenum
"1"
127.0.0.1:6379> decr likenum # 减1
(integer) 0
127.0.0.1:6379> get number
"0"

Операция истечения срока действия Redis String

127.0.0.1:6379> expire name 60 # 设置超时时间
(integer) 1
127.0.0.1:6379> setex name 60 value # 等价于 setex + expire
OK
127.0.0.1:6379> ttl key # 查看数据还有多久过期
(integer) 11

Строка состоит из нескольких байтов, а каждый байт состоит из 8 бит.

Сценарии использования Redis String

  • Кэш: как мы обычно разрабатываем, мы часто конвертируем объект в строку json, а затем помещаем его в Redis для кеша.

  • Счетчики: как пост блогов читается, комментарии, лайки и т. Д.

  • Распределенные системы генерируют самоувеличивающиеся идентификаторы

2. List

Списки Redis эквивалентны LinkedList на языке Java.

Преимущества LinkedList: высокая скорость вставки, независимо от того, вставляется ли он с конца или с середины.

Недостатки LinkedList: Низкая производительность случайного чтения, например, LinkedList.get(10).Эта операция имеет очень низкую производительность, потому что ей нужно пройти по связанному списку и пройти по связанному списку с самого начала, пока не будет найден элемент с индексом = 10. .

Как тип данных Redis List реализует очередь?

справа налево

127.0.0.1:6379> rpush apps qq # 将元素插入到列表的尾部(最右边)
(integer) 1
127.0.0.1:6379> rpush apps wechat taobao # 将多个元素插入到列表的尾部(最右边)
(integer) 3
127.0.0.1:6379> lpop apps # 移除并返回列表的第一个元素(最左边)
"qq"
127.0.0.1:6379> lrange apps 0 1 # 返回列表中指定区间内的元素,0表示第一个,1表示第二个,-1表示最后一个
1) "wechat"
2) "taobao"
127.0.0.1:6379> lrange apps 0 -1 # -1表示倒数第一
1) "wechat"
2) "taobao"

Уведомление:Когда в списке появляется последний элемент, структура данных автоматически удаляется, а память освобождается.

Как тип данных Redis List реализует стеки?

Первый вошел, первый вышел, прямо в, прямо

127.0.0.1:6379> rpush apps qq wechat taobao
(integer) 3
127.0.0.1:6379> rpop apps # 移除列表的最后一个元素,返回值为移除的元素
"taobao"

Сценарии использования списка Redis

  • Асинхронная очередь

  • Опрос задач (RPOPPLPUSH)

  • Список статей (диапазон клавиш 0 9)

3.Hash

Hash-структура Redis эквивалентна HashMap языка Java, внутренняя структура реализации согласуется с HashMap JDK1.7, а нижний уровень реализуется данными + связанным списком.

Общие команды Redis Hash

127.0.0.1:6379> hmset userInfo name "hzy" age "24" sex "1"
OK
127.0.0.1:6379> hexists userInfo name # 相当于HashMap的containsKey()
(integer) 1
127.0.0.1:6379> hget userInfo name # 相当于HashMap的get()
"hzy"
127.0.0.1:6379> hget userInfo age
"24"
127.0.0.1:6379> hgetall userInfo # 数据量大时,谨慎使用!获取在哈希表中指定 key 的所有字段和值
1) "name"
2) "hzy"
3) "age"
4) "24"
5) "sex"
6) "1"
127.0.0.1:6379> hkeys userInfo # 数据量大时,谨慎使用!获取 key 列表
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals userInfo # 获取 value 列表
1) "hzy"
2) "24"
3) "1"
127.0.0.1:6379> hset userInfo name "test" # 修改某个字段对应的值
127.0.0.1:6379> hget userInfo name
"test"

Сценарии использования Redis Hash

  • Запишите количество посетителей всего блога (HyperLogLog будет учитываться в конференции по объему данных, но в этой структуре данных есть небольшая ошибка. Если ошибку нельзя принять, можно рассмотреть другие решения)

  • Запишите количество посещений домашней страницы блогера в блоге, имя блогера, контактную информацию и адрес.

4.Set

Коллекция наборов Redis эквивалентна HashSet в Java. Тип набора в Redis — это неупорядоченная коллекция, и элементы в коллекции не имеют порядка.

Дополнение: hashset реализован на основе Hashmap, Hashset, он же собственно коллекция, внутриэлементы неупорядочены, в немЭлементы не могут повторятьсяДа, ключи HashMap не по порядку, порядок вставки отличается от порядка итеративного обхода, и ключи HashMap не повторяются, HashSet реализован непосредственно на основе HashMap.

Общие команды Redis Set

127.0.0.1:6379> sadd apps wechat qq # 添加元素
(integer) 2
127.0.0.1:6379> sadd apps qq # 重复
(integer) 0
127.0.0.1:6379> smembers apps # 注意:查询顺序和插入的并不一致,因为 set 是无序的
1) "qq"
2) "wechat"
127.0.0.1:6379> scard apps # 获取长度
(integer) 2
127.0.0.1:6379> sismember apps qq # 谨慎使用!检查某个元素是否存在set中,只能接收单个元素
(integer) 1
127.0.0.1:6379> sadd apps2 wechat qq
(integer) 2
127.0.0.1:6379> sinterstore apps apps apps2 # 获取 apps 和 apps 的交集并存放在 apps3 中
(integer) 1
127.0.0.1:6379> smembers app3
1) "qq"
2) "wechat"

Уведомление:Когда последний элемент в коллекции удаляется, структура данных автоматически удаляется, а память высвобождается.

Сценарии использования Redis Set

  • Лотерея Weibo: если объем данных не особенно велик, вы можете использовать spop (удалить и вернуть случайный элемент в наборе) или srandmember (вернуть одно или несколько случайных чисел в наборе).

  • Метка QQ: несколько заметок для одного пользователя

  • общая забота (пересечение)

  • общие друзья (перекресток)

5.sorted set

отсортированный набор является упорядоченным набором.Сортированный набор добавляет оценку весового параметра, так что элементы в наборе могут быть отсортированы в соответствии с оценкой, а список элементов может быть получен через диапазон оценки. Делает его похожим на комбинацию TreeSet и HashMap в Java.

Отсортированный набор общих команд

127.0.0.1:6379> zadd apps 3.0 qq # 添加元素到 sorted set 中,3.0是score的值
(integer) 1
127.0.0.1:6379> zadd apps 2.0 wechat 1.0 aliyun # 一次添加多个元素
(integer) 2
127.0.0.1:6379> zcard apps # 查看 sorted set 中的元素数量
(integer) 3
127.0.0.1:6379> zscore apps wechat # 查看某个 value 的权重
"2.0"
127.0.0.1:6379> zrange apps 0 -1 # 通过索引区间返回有序集合指定区间内的成员,0 -1 表示输出所有元素
1) "aliyun"
2) "wechat"
3) "qq"
127.0.0.1:6379> zrange apps 0 1 # 通过索引区间返回有序集合指定区间内的成员
1) "aliyun"
2) "wechat"
127.0.0.1:6379> zrevrange apps 0 1 # 相当于zrange的反转
1) "qq"
2) "wechat"

Уведомление:После удаления последнего значения в отсортированном наборе структура данных автоматически удаляется, а память освобождается.

Сценарии использования отсортированного набора

  • Таблица лидеров

  • Время ожидания оплаты заказа (вставьте при размещении заказа, участник — это номер заказа, оценка — это отметка времени ожидания заказа, а затем напишите запланированное задание для выполнения zrange через равные промежутки времени)