1. 程式人生 > >記錄自己的redis之路-05-redis熱搜排序例項

記錄自己的redis之路-05-redis熱搜排序例項

建立MySort例項

package com.qrcode.redisdemo.redis02;

import com.qrcode.redisdemo.redis.RedisService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Set;


@Component
public class MySort {

    private static final  String  ZSET = "zset";

    @Resource
    private RedisService redisService;

    /**
     * 根據key 進行快取操作
     * @param key
     */
    public void sort(String key){
        Long rank2 = redisService.rank(ZSET, key);
        // 如果rank2為null,則快取裡面不存在該值
        if(null == rank2){
            // 不存在,則新增,預設排序為1
            redisService.zAdd(ZSET,key,1.0);
            System.out.println("當前:"+key +":的搜尋次數為"+1);
        }else {
            // 如果存在,則獲取排序值  並且+1
            int score = (int)redisService.score(ZSET, key);
            System.out.println("當前:"+key +":的搜尋次數為"+(score+1));
            redisService.zAdd(ZSET,key,score+1);
        }
    }

    /**
     * 從高到低的排序集中獲取從頭(start)到尾(end)內的元素。
     * @param start 0 表示第一個
     * @param end  -1 表示最後
     * @return
     */
    public Set<Object> findZset(long start, long end){
        return redisService.reverseRange(ZSET, start, end);
    }
}

redisService中的方法:

/**
 * 獲得key數組裡面key2元素的索引
 * @param key
 * @param key2
 * @return
 */
public Long rank(String key, Object key2) {
    ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
    return zset.rank(key, key2);
}



/**
 * 有序集合新增
 *
 * @param key
 * @param value
 * @param scoure
 */
public void zAdd(String key, Object value, double scoure) {
    ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
    zset.add(key, value, scoure);
}



/**
 * 獲得key數組裡面key2元素的排序值
 * @param key
 * @param key2
 * @return
 */
public double score(String key, Object key2) {
    ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
    return zset.score(key, key2);
}



/**
 * 從高到低的排序集中獲取從頭(start)到尾(end)內的元素。
 * @param key
 * @param start
 * @param end
 * @return
 */
public Set<Object> reverseRange(String key, long start, long end) {
    ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
    return zset.reverseRange(key, start, end);
}

結果:

第一次

mySort.sort("上海");
Set<Object> zset = mySort.findZset(0, -1);
for
(Object o : zset){
   System.
out.println(o);
}

此時再加入一個

mySort.sort("上海");
mySort.sort("北京");
Set<Object> zset = mySort.findZset(0, -1);
for
(Object o : zset){
   System.
out.println(o);
}

此時的資料都在set集合中, 可以考慮定時任務

,每天吧集合中的資料儲存到資料庫中

相關推薦

記錄自己redis-05-redis排序例項

建立MySort例項 package com.qrcode.redisdemo.redis02; import com.qrcode.redisdemo.redis.RedisService; im

記錄自己redis-03-redis主從配置

應用場景 一般來說,要將Redis運用於工程專案中,只使用一臺Redis是萬萬不能的,原因如下: a) 從結構上,單個Redis伺服器會發生單點故障,並且一臺伺服器需要處理所有的請求負載,壓力較大; b) 從容量上,單個Redis伺服器記憶體容量有限,就算一臺Redis

菜雞的redis(三)-redis啟動3個警告資訊解決

Redis伺服器啟動3個警告資訊的解決方案 ################################################################################## 第一個警告資訊:The TCP backlog settin

Redis 學習 (010) - redis命令手冊

哈希 sts 集中 cluster htm second 不同 index scribe Redis 鍵(key) 命令 命令描述 Redis DEL 命令 該命令用於在 key 存在是刪除 key。 Redis Dump 命令 序列化給定 key ,並返回被

大資料學習103-redis的分片代理

哨兵的出現是為了實現主節點的HA,那麼從節點會不會出現問題呢? 假如所有的讀取操作都在從節點6380上,那麼6380節點就會很累,而6381節點就會很清閒。 這個時候就需要負載均衡,我們這裡的負載均衡需要通過代理伺服器來實現。我們可以將需要訪問的從節點的位置配置在代理伺服器上。

大資料學習102-redis的哨兵機制

哨兵的HA會通過修改配置檔案來實現主節點的切換。 只有主節點有寫許可權,從節點只能讀。 我們接下來實驗一下: 首先我們將redis的三個埠的服務啟動起來: 然後我們啟動哨兵: 接下來我們強制將主節點關掉,看哨兵會做什麼事? 我們可以看到此時的

大資料學習101-redis的持久化詳解及主從複製

接下來我們配置一下主從結構的星型模型: 首先將配置檔案複製3份, 然後修改主節點的配置檔案: 首先關閉RDB: 然後關閉AOF: 修改第二個配置檔案: 先修改埠,他不能和主節點的埠衝突: 為了區分是哪個節點打的日誌,我們還需要

Redis

前言:資料庫是一切資料的源頭,因此我們沒有逃避的理由 (一) 什麼是redis?   redis是nosql(not noly sql)產品中最為出色的一種非關係型的資料庫,主要包括以下幾種儲存結構:String,list,set,hash,sorted set,為高併發而生,其中讀的速度為11

菜雞的redis(四)-常見快取問題快取穿透

常見的redis快取問題 1.快取穿透 -->頻繁查詢一個不存在的資料,由於快取不命中,每次都要查詢持久層,從而失去快取的意義 2.快取雪崩 -->快取大量失效的時候,引發大量查詢資料庫 3.熱點Key -->某個key訪問非常頻繁,當key失效的時候,有大

java架構-(Redis專題)Redis的高效能和持久化

  上次我們簡單的說了一下我們的redis的安裝和使用,這次我們來說說redis為什麼那麼快和持久化資料   在我們現有的redis中(5.0.*之前的版本),Redis都是單執行緒的,那麼單執行緒的Redis為什麼還會有那麼高的效率呢?因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算,而且單執行

java架構-(Redis專題)Redis的主從、哨兵和叢集

  我們使用的redis,單機的絕對做不到高可用的,萬一單機的redis宕機了,就沒有備用的了,我們可以採用叢集的方式來保證我們的高可用操作。 主從架構      大致就是這樣的,一個主節點,兩個從節點(一般兩個就可以了) 主從工作原理    如果你為master配置了一個slave,不管這個sla

java架構-(Redis專題)SpringBoot連線Redis超簡單

  上次我們搭建了Redis的主從架構,哨兵架構以及我們的叢集架構,但是我們一直還未投入到實戰中去,這次我們用jedis和springboot兩種方式來操作一下我們的redis 主從架構   如何配置我上次已經講過了,https://www.cnblogs.com/cxiaocai/p/11711377.ht

java架構-(Redis專題)簡單聊聊redis分散式鎖

  這次我們來簡單說說分散式鎖,我記得過去我也過一篇JMM的記憶體一致性演算法,就是說拿到鎖的可以繼續操作,沒拿到的自旋等待。 思路與場景   我們在Zookeeper中提到過分散式鎖,這裡我們先用redis實現一個簡單的分散式鎖,這裡是我們一個簡單的售賣減庫存的小例項,剩餘庫存假設存在資料庫內。 @Get

java架構-(Redis專題)聊聊大廠那些redis

  上幾次說了redis的主從,哨兵,叢集配置,但是內部的選舉一直沒說,先來簡單說一下選舉吧。 叢集選舉   redis cluster節點間採取gossip協議進行通訊,也就是說,在每一個節點間,無論主節點還是從節點,他們之間都是存在相互通訊的。例如你的redis埠號是6379,那麼你的gossip協議埠號

java架構-(Redis專題)redis面試助力滿分+

1.Redis支援的資料型別? 答:五種,在第一節redis相關的部落格我就說過,String,Hash,List,Set,zSet,也就是我們的字串,雜湊,列表,集合,有序集合五種。結構圖如下。  2.什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼? 答:Redis持久化主

[ASP.NET MVC 小牛]05 - 使用 Ninject實現依賴註入

構造註入 ted ets pathinfo ref 最重要的 map ice prot 在[ASP.NET MVC 小牛之路]系列上一篇文章(依賴註入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的兩件事情,續這篇文章之後,本文將用一

記錄Python學習----------------應用工具

完全小白最近想要自學Python,也想要好好經營自己的部落格,於是開啟我的第一個部落格,希望自己能堅持下去寫下去。好了不多說,開始吧。 1.安裝python3 Windows系統下,首先檢查電腦是否安裝過Python,按下“windoes+R”進入命令視窗,輸入‘’Python‘’,回車。如

記錄python學習----------------------------------------函式

函式的基本結構: def  函式名():      操作程式碼 def是函式定義,告訴python函式名,冒號後面的語句都要縮排,縮排的語句是函式體。注意,千萬要注意縮排。 最重要的是一般情況下,函式會有實參和形參,形參是函式完成其工作所需的一

記錄python學習----------------------------------------------使用者輸入和while迴圈

乘著週末休息,跟新之前學習的知識,也算是複習了。 一、使用者輸入 使用者輸入:input函式,python主要解讀為字串,對於數值輸入該如何呢,採用int(),將數字的字串轉換為數值。 在處理數值關係時,除了等於不等於大於小於等,還有求模運算子%,兩個數相除,返回餘數。這就可以用作偶

記錄Python學習-----------------------------《Python程式設計入門到實踐》作業習題合集 ====接上一章

接上一章連結如下: https://blog.csdn.net/shinhwa96/article/details/83373902 #-*-coding:GBK-*- #-*-coding:utf-8-*- #7-4 pizza_peiliao="請您輸入pizza配料:" messa