diff --git a/lib/gitlab/sidekiq_versioning.rb b/lib/gitlab/sidekiq_versioning.rb
index 28c9714f82f3138ed0cff5b6e938dac626ff1c8f..8ca37698f41983d40df250577a0897979938295a 100644
--- a/lib/gitlab/sidekiq_versioning.rb
+++ b/lib/gitlab/sidekiq_versioning.rb
@@ -6,11 +6,13 @@ def self.install!
       # The Sidekiq client API always adds the queue to the Sidekiq queue
       # list, but mail_room and gitlab-shell do not. This is only necessary
       # for monitoring.
-      queues = SidekiqConfig.worker_queues
-
+      queues = ::Gitlab::SidekiqConfig.routing_queues
       if queues.any?
         Sidekiq.redis do |conn|
-          conn.sadd('queues', queues)
+          conn.multi do |multi|
+            multi.del('queues')
+            multi.sadd('queues', queues)
+          end
         end
       end
     rescue ::Redis::BaseError, SocketError, Errno::ENOENT, Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT, Errno::ECONNRESET, Errno::ECONNREFUSED
diff --git a/spec/lib/gitlab/sidekiq_versioning_spec.rb b/spec/lib/gitlab/sidekiq_versioning_spec.rb
index bdbba04e0c0fb84a11da119d500ec3b0c5204d3f..9501339ee30fc6f26d93c50f4acb42d122f24759 100644
--- a/spec/lib/gitlab/sidekiq_versioning_spec.rb
+++ b/spec/lib/gitlab/sidekiq_versioning_spec.rb
@@ -4,16 +4,40 @@
 
 RSpec.describe Gitlab::SidekiqVersioning, :clean_gitlab_redis_queues do
   before do
-    allow(Gitlab::SidekiqConfig).to receive(:worker_queues).and_return(%w[foo bar])
+    allow(Gitlab::SidekiqConfig).to receive(:routing_queues).and_return(%w[foo bar])
   end
 
+  subject(:queues) { Sidekiq::Queue.all.map(&:name) }
+
   describe '.install!' do
     it 'registers all versionless and versioned queues with Redis' do
       described_class.install!
 
-      queues = Sidekiq::Queue.all.map(&:name)
       expect(queues).to include('foo')
       expect(queues).to include('bar')
     end
+
+    context 'when some queues outside routing rules were already registered' do
+      before do
+        Sidekiq.redis do |conn|
+          conn.sadd('queues', 'a', 'b', 'c', 'foo')
+        end
+      end
+
+      it 'removes the queues outside routing rules' do
+        described_class.install!
+
+        expect(queues).not_to include('a')
+        expect(queues).not_to include('b')
+        expect(queues).not_to include('c')
+      end
+
+      it 'registers all queues in routing rules' do
+        described_class.install!
+
+        expect(queues).to include('foo')
+        expect(queues).to include('bar')
+      end
+    end
   end
 end